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.
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!
}
}
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:
Code:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.KeyDown += new KeyEventHandler(MyCanvas_KeyDown);
tester = new test();
MyCanvas.Children.Add(tester.Paint());
}
private test tester;
private void MyCanvas_KeyDown(object sender, KeyEventArgs e)
{
if (Keyboard.IsKeyDown(Key.A))
{
tester.move(-25);
}
if (Keyboard.IsKeyDown(Key.D))
{
tester.move(25);
}
}
}
test Class:
Code:
class test
{
private double pos_x;
private double pos_y;
public test()
{
}
public Polygon 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;
Canvas.SetTop(poly, pos_y);
Canvas.SetLeft(poly, pos_x);
return poly;
}
public void move(double x)
{
pos_x = x;
Paint();
}
}
So wird es natürlich gezeichnet aber eben immer nebeneinander und selbst mit MyCanvas.Children.Remove(tester.Paint()); verschwindet das Polygon nicht.
Code:
public partial class MainWindow : Window
{
private void MyCanvas_KeyDown(object sender, KeyEventArgs e)
{
if (Keyboard.IsKeyDown(Key.A))
{
MyCanvas.Children.Remove(tester.Paint());
MyCanvas.Children.Add(tester.move(-25));
}
if (Keyboard.IsKeyDown(Key.D))
{
MyCanvas.Children.Add(tester.move(25));
}
}
}
class test
{
public Polygon move(double x)
{
pos_x = x;
return Paint();
}
}
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:
Code:
private void MyCanvas_KeyDown(object sender, KeyEventArgs e)
{
MyCanvas.Children.Clear();
MyCanvas.Children.Add(tester.Paint());
if (Keyboard.IsKeyDown(Key.A))
{
tester.move(-25);
}
if (Keyboard.IsKeyDown(Key.D))
{
tester.move(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: