Feedback

C# - Wpf Canvas-Eigenschaften wieder ändern lassen nach Animation

Veröffentlicht von am 2/6/2014
(0 Bewertungen)
Ich habe Objekte, die mittels Maus bewegt werden sollen in einem Canvas.

Doch die Größe der Elemente sollte sich per Animation abspielen. Die Größenbestimmung erfolgte durch Anfasser an den Ecken und Kanten der Objekte.

Die Animation führte beim Loslassen die Animation zu den Zielen aus.
Doch die Animation hatte auch nach der Beendigung das Objekt im Griff, so dass ich die skalierten/animierten Objekte nicht mehr durch die Maus verschieben ließen, da die Methode zum Verschieben ebenfalls auf die Canvas.Attached-Properties des Objektes zugreift.

Daher muss das Storyboard von jedem animierten Objekt im Anschluss an die Animation gelöst werden; per Storyboard.Remove().

Vorher müssen jedoch die aktuellen Werte des Objektes per Code übertragen werden, da sie sonst verloren gehen und das Objekt die Position und Größe vor der Animation einnehmen würde.

Kurz: Das Verschieben nach der Animation war nicht mehr möglich, weil die Animation zwar zuende, jedoch nicht vom animierten Objekt abgekoppelt war.

Betrifft:
Canvas.LeftProperty
Canvas.TopProperty
private void Story_Completed(object sender, EventArgs e)
{
	// Die Story den viewPaint.Resources hinzugefügen, damit sie im Completed Event per .Remove() -Methode entfernt werden kann.
	Storyboard story = (Storyboard)viewPaint.TryFindResource(STORYBOARD_NAME);

	// Die Zielattribute abschreiben und im Objekt sichern.
	Rect targetPosition = new Rect(
		((DoubleAnimation)story.Children[0]).To ?? 0,
		((DoubleAnimation)story.Children[1]).To ?? 0,
		((DoubleAnimation)story.Children[2]).To ?? 0,
		((DoubleAnimation)story.Children[3]).To ?? 0);

	// Das animierte Ziel wurde an jeder DoubleAnimation per Storyboard.SetTarget verankert.
	FrameworkElement animatedTarget = (FrameworkElement)Storyboard.GetTarget(story.Children[0]);
	
	Canas.SetLeft(animatedTarget, targetPosition.X);
	Canas.SetTop(animatedTarget, targetPosition.Y);
	animatedTarget.Width = animatedTarget.ActualWidth;
	animatedTarget.Height = animatedTarget.ActualHeight;

	// Die Animation vom Objekt entfernen, damit sich Canvas-Parameter für das Objekt wieder ändern lassen.
	story.Remove(viewPaint);
}

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!