2016-05-25 12 views
1

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

+0

Es ist ein Teil der MainWindow-Klasse von Windows abgeleitet. Und Rectangle ist [email protected] – HDQ

Antwort

1

Ihr Problem ist hier:

(this.FindName("rect") as Rectangle).Fill = Brushes.Blue; 

Zunächst einmal wäre es viel einfacher rect ein Feld zu machen, und stellen Sie die Fill Eigenschaft direkt:

rect.Fill = Brushes.Blue; 

Das würde deiner Farbanimation allerdings nicht helfen. Sie haben eine Animation eingerichtet, um mit targetRectBrush zu arbeiten, die rect nicht mehr füllt, da Sie sie gerade ersetzt haben. Wenn Sie diese eine Zeile entfernen, wird die Farbe animiert.

UPDATE

Hier ist eine leicht gezwickt Version:

public partial class MainWindow 
{ 
    private int i; 
    private Storyboard hitTargetStoryboard; 
    private List<double> disList; 
    private Rectangle rect; 

    public MainWindow() 
    { 
     InitializeComponent(); 
     Loaded += Window_Loaded; 
    } 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     disList = new List<double> {10, 20, 30, 40, 50, 60, 70, 80, 90, 100 }; // init with a list of values. 

     /* Create a 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 
      { 
       From = Colors.Blue, // (Instead of setting Fill to Blue) 
       To = Colors.Green, 
       Duration = TimeSpan.FromSeconds(0.3), 
       FillBehavior = FillBehavior.Stop, // Returns to Blue 
      }; 
     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) 
    { 
     i = i % disList.Count; // Don't overflow 

     DoubleAnimation da = new DoubleAnimation 
      { 
       From = 0, 
       To = disList[i], 
       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); 
    } 
} 

Welches Problem haben Sie mit der Entfernung/Dauer zu sehen?

+0

Ich habe diese Zeile entfernt und die colorAnimation funktioniert. Aber ich brauche das Rechteck wieder blau. Was soll ich damit machen? – HDQ

+0

Außerdem funktioniert die DoubleAnimation, die sich rect bewegt, nicht gut nach MouseDown-Ereignis, dass der Rect gerade in der Mitte gestoppt hat. – HDQ

+1

Ich habe meine Antwort aktualisiert, indem ich 'FillBehavior' gesetzt habe, um die Farbe blau zu setzen. Ich verstehe nicht, was dein Problem mit der Bewegung ist; Sie rufen 'TargetAnimation' explizit auf, wenn die Farbanimation abgeschlossen ist. Wenn Sie das nicht möchten, können Sie ganz auf 'HitCA_Completed' verzichten. –