Es gibt ein blaues Rechteck, das sich von der linken Seite des Fensters nach rechts verschiebt.wpf animation - mouse down Ereignis funktioniert nicht
Wenn Sie entweder auf das Rechteck oder die Animation klicken, wird das Rechteck von der linken Seite wieder bewegt.
Wenn auf ein Rechteck geklickt wird, wird die Farbe grün mit einer Dauer von 0,3s.
Aber das MouseDown-Ereignis schien die ColorAnimation nicht zu starten und die Bewegungsentfernung/Dauer des Rechtecks war auch nicht korrekt.
private int i;
private Storyboard hitTargetStoryboard;
private List<double> disList;
private void Window_Loaded(object sender, RoutedEventArgs e)
{
disList = new List<double>{.......}; // init with a list of values.
/* Create a rectangle */
Rectangle rect = new Rectangle();
this.RegisterName("rect", rect);
rect.Height = this.ActualHeight;
rect.Width = 50;
Canvas.SetTop(rect, 0);
Canvas.SetLeft(rect, 0);
/* Fill rect with a solid brush */
SolidColorBrush targetRectBrush = new SolidColorBrush(Colors.Blue);
this.RegisterName("targetRectBrush", targetRectBrush);
rect.Fill = targetRectBrush;
/* Add mouse down event */
rect.MouseDown += Rect_MouseDown;
/* Add rect to Canvas */
myCanvas.Children.Add(rect);
/* Create ColorAnimation to change color smoothly */
ColorAnimation hitCA = new ColorAnimation();
hitCA.To = Colors.Green;
hitCA.Duration = TimeSpan.FromSeconds(0.3);
hitCA.Completed += HitCA_Completed;
/* Create storyboard and add ColorAnimation to it */
hitTargetStoryboard = new Storyboard();
Storyboard.SetTargetName(hitCA, "targetRectBrush");
Storyboard.SetTargetProperty(hitCA, new PropertyPath(SolidColorBrush.ColorProperty));
hitTargetStoryboard.Children.Add(hitCA);
i = 0;
TargetAnimation(i);
}
/* move the rect from 0--disList[i] */
private void TargetAnimation(int i)
{
(this.FindName("rect") as Rectangle).Fill = Brushes.Blue;
DoubleAnimation da = new DoubleAnimation();
da.From = 0;
da.To = disList[i];
da.Duration = TimeSpan.FromSeconds(5);
Storyboard.SetTargetName(da, "rect");
Storyboard.SetTargetProperty(da, new PropertyPath(Canvas.LeftProperty));
Storyboard storyboard = new Storyboard();
storyboard.Children.Add(da);
storyboard.Completed += Storyboard_Completed;
storyboard.Begin(this);
}
/* If rect clicked, it will change color to green */
private void Rect_MouseDown(object sender, MouseButtonEventArgs e)
{
hitTargetStoryboard.Begin(this);
}
/* After color changed, rect starts over */
private void HitCA_Completed(object sender, EventArgs e)
{
TargetAnimation(++i);
}
/* If rect not clicked, it will start over */
private void Storyboard_Completed(object sender, EventArgs e)
{
TargetAnimation(++i);
}
UPDATE:
löschen: (this.FindName ("rect") als Rechteck) .Fill = Brushes.Blue;
hinzufügen: hitCA.From = Colors.Blue;
ColorAnimation funktioniert gut.
Still:
Wenn ich Storyboard_Completed
oder HitCA_Completed
löschen, geht die Bewegung von rect gut. Wenn ich beides habe, läuft die Bewegung falsch.
UPDATE 2:
edit: storyboard.Begin(this, true)
in TargetAnimation(int i)
Methode.
hinzufügen: stroyboard.Stop(this)
in HitCA_Completed
Methode.
ohne Einstellung isControallable
zu true
wird das Storyboard nicht steuerbar sein.
GELÖST
Es ist ein Teil der MainWindow-Klasse von Windows abgeleitet. Und Rectangle ist [email protected] – HDQ