myGully.com Boerse.SH - BOERSE.AM - BOERSE.IO - BOERSE.IM Boerse.BZ .TO Nachfolger
Zurück   myGully.com > Computer & Technik > Programmierung
Seite neu laden

c# - Canvas

Willkommen

myGully

Links

Forum

 
Antwort
Themen-Optionen Ansicht
Ungelesen 03.05.11, 12:11   #1
Dergecko911
Erfahrener Newbie
 
Registriert seit: Sep 2009
Beiträge: 95
Bedankt: 16
Dergecko911 ist noch neu hier! | 0 Respekt Punkte
Standard c# - Canvas

Servus,

hab ein kleines Problemchen mit einem Canvas in ner WPF.
Hab schonr elativ viel ausprobiert jedoch bekomm ichs nicht hin in ein Canvas zu zeichnen ohne direkt in der Main class zu sein.

ich poste einfach mal ein Beispiel

Lg DerGecko


in der main.xaml steht:
Code:
 Canvas Height="288" HorizontalAlignment="Left" Margin="0,23,0,0" Name="myCanvas" VerticalAlignment="Top" Width="501" /
In der main.cs
Code:
public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            test re = new test();
            re.paint(); <- geht nicht!
            paint(); <- geht!

        }
        public void paint()
        {
            PointCollection points = new PointCollection();
            points.Add(new Point(10, 0));
            points.Add(new Point(0, 10));
            points.Add(new Point(20, 10));

            LinearGradientBrush brush = new LinearGradientBrush();
            brush.StartPoint = new Point(0.5, 0);
            brush.EndPoint = new Point(0.5, 1);
            brush.GradientStops.Add(new GradientStop(Color.FromRgb(255, 0, 0), 0.0));
            brush.GradientStops.Add(new GradientStop(Color.FromRgb(0, 255, 0), 0.0));



            Polygon poly = new Polygon();
            poly.Fill = brush;
            poly.Points = points;
            //      startpos();
            //      Canvas.SetBottom(poly, pos_x);

            myCanvas.Children.Add(poly);
        }

    }

class test : MainWindow
{
    public test()
    { }

    public void paint()
    {
        PointCollection points = new PointCollection();
        points.Add(new Point(10, 0));
        points.Add(new Point(0, 10));
        points.Add(new Point(20, 10));

        LinearGradientBrush brush = new LinearGradientBrush();
        brush.StartPoint = new Point(0.5, 0);
        brush.EndPoint = new Point(0.5, 1);
        brush.GradientStops.Add(new GradientStop(Color.FromRgb(255, 0, 0), 0.0));
        brush.GradientStops.Add(new GradientStop(Color.FromRgb(0, 255, 0), 0.0));

        Polygon poly = new Polygon();
        poly.Fill = brush;
        poly.Points = points;
        myCanvas.Children.Add(poly);
    }
}
__________________
[ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]
Dergecko911 ist offline   Mit Zitat antworten
Ungelesen 03.05.11, 12:25   #2
Xalir
Erfahrener Newbie
 
Registriert seit: Mar 2009
Beiträge: 154
Bedankt: 56
Xalir ist noch neu hier! | 0 Respekt Punkte
Standard

Kann auch nicht funktionieren. Du versuchst die Klasse MainWindow zu erben. MainWindow wird aber durch die Klasse App bereits instanziert.

Einfachste Lösung wäre, dass Du Deiner Klasse test einfach das instanzierte MainWindow im Konstruktor übergibst.
Xalir ist offline   Mit Zitat antworten
Ungelesen 03.05.11, 12:43   #3
Dergecko911
Erfahrener Newbie
 
Registriert seit: Sep 2009
Beiträge: 95
Bedankt: 16
Dergecko911 ist noch neu hier! | 0 Respekt Punkte
Standard

wenn du mir noch sagen könntest wie das funktioniert wär ich dir sehr dankbar.

edit: also wenn ich mit Window main-copy = this;
und main-copy im konstruktor übergebe wie greif ich dann wiederum auf das Canvas zu :-(

ok habs :-)

in der MainWindow Klasse:
Code:
private Canvas myCanvas = new Canvas();
public Canvas MyCanvas
        { 
            get { return myCanvas; }
            set { myCanvas = value; }
        }
private void Window_Loaded(object sender, RoutedEventArgs e)
        {
                     
            MainWindow main = this;
            main.Content = myCanvas;
         }
alle anderen Klassen die das Canvas verwenden wollen:
Code:
class test
        {
             private MainWindow main; 
             public test(MainWindow main)
             { this.main = main; }
   public void Paint()
        {
             main.MyCanvas.Children.Add(poly); //poly ist das uielement das gezeichnet wird!
         }
}
__________________
[ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]
Dergecko911 ist offline   Mit Zitat antworten
Ungelesen 13.05.11, 10:29   #4
Dergecko911
Erfahrener Newbie
 
Registriert seit: Sep 2009
Beiträge: 95
Bedankt: 16
Dergecko911 ist noch neu hier! | 0 Respekt Punkte
Standard

Ich hab leider ein weiteres Problem.
Wenn ich ein Objekt bewegen will mit Canvas.Setleft(poly, pos_x) wird das Objekt nicht neu gezeichnet.
Es erhält zwar die pos_x aber das Canvas zeichnet es nicht, außer ich füge es neu mit MyCanvas.Children.Add hinzu.
Dann allerdings ist das Polygon 2 mal vorhanden.

Main Class:

test Class:



So wird es natürlich gezeichnet aber eben immer nebeneinander und selbst mit MyCanvas.Children.Remove(tester.Paint()); verschwindet das Polygon nicht.



Die möglichkeit MyCanvas.Children.clear() würde funktionieren nur will ich später mehrere Objekt auf dem Bildschirm haben. MUSS ich wirklich bei jeder bewegung ALLE objekte neu zum Canvas hinzufügen?

Das funktioniert:


Ich hoffe ihr könnt mir weiterhelfen :-)
__________________
[ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]
Dergecko911 ist offline   Mit Zitat antworten
Ungelesen 13.05.11, 11:25   #5
Xalir
Erfahrener Newbie
 
Registriert seit: Mar 2009
Beiträge: 154
Bedankt: 56
Xalir ist noch neu hier! | 0 Respekt Punkte
Standard

Ich sehe schon das Problem. Du definierst in Deiner Paint-Funktion ein neues Polygon. Jedesmal, wenn Du move aufrufst, ruft dies wiederum Paint auf, welches ein neues Polygon zeichnet.

Lösung? Überdenke Dein Klassendesign. Wenn ich Du wäre, würde ich das Polygon selbst im Konstruktor definieren. Dann kannst Du im Canvas selbst das Objekt so übergeben:

Code:
MyCanvas.Children.Add(new tester());
Xalir ist offline   Mit Zitat antworten
Antwort


Forumregeln
Du kannst keine neue Themen eröffnen
Du kannst keine Antworten verfassen
Du kannst keine Anhänge posten
Du kannst nicht deine Beiträge editieren

BB code is An
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.

Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:07 Uhr.


Sitemap

().