Feedback

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

Veröffentlicht von am 06.02.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
GFU-Schulungen  [Anzeige]

VB.NET 2017/2015/2013 Komplett

Ziel des Seminars ist der flexible Umgang mit VB.NET, wie z.B. die damit verbundene eigenständige Entwicklung von Programmen oder das Verwenden von Datenbanken.

Visual Studio Team Foundation Server 2017/2015 (TFS) für Projektmitglieder - Kompakt

Nach Teilnahme an dieser Schulung sind Ihnen die Grundlagen von ALM geläufig. Sie planen und steuern Projekte effizient mit dem Visual Studio Team Foundation Server.

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!