myGully.com

myGully.com (https://mygully.com/index.php)
-   Programmierung (https://mygully.com/forumdisplay.php?f=67)
-   -   c# - Canvas (https://mygully.com/showthread.php?t=2298077)

Dergecko911 03.05.11 12:11

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);
    }
}


Xalir 03.05.11 12:25

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.

Dergecko911 03.05.11 12:43

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!
        }
}


Dergecko911 13.05.11 10:29

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 :-)

Xalir 13.05.11 11:25

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());


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:33 Uhr.

Powered by vBulletin® (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.