[C#] DependencyProperty nach einer Animation wieder händisch ändern

Mal wieder eine dieser Stolperfallen auf die ich immer und immer wieder reinfalle. Animiere ich in einer meiner Oberflächen eine DependencyProperty (z.B. Width, Height, Margin, Opacity usw.) und versuche diese irgendwann später händisch auf einen anderen Wert zu setzen, dann wird meine Änderung ignoriert und stoisch der letzte Wert der Animation gehalten. Das Verhalten ist zwar extrem nervig, aber dennoch korrekt, wenn man die DependencyProperty Präzedenzliste stets im Hinterkopf behält. Diese definiert nämlich welchen Wert eine DependencyProperty letztendlich besitzt, wenn deren Wert an unterschiedlichen Stellen gesetzt wurde (z.B. Template, Style, lokale Wertzuweisung oder eben Animation).

// Irgendeine Animation, z.B. eine für das Margin Property
ThicknessAnimation _animation = new ThicknessAnimation(new Thickness(100,100, 0, 0), TimeSpan.FromSeconds(1));

// Animation starten
mIcon.BeginAnimation(MarginProperty, _animation);

// Irgendwann später Den Margin selbst setzen? 
// Pff, vergiss es
mIcon.Margin = new Thickness(0)

Da eine Animation eine höhere Präzedenz hat als mein lokal gesetzter Wert, kann ich hier so lange fluchen wie ich will, mein Margin bleibt auf (100,100,0,0).

Die Lösung des Problems liegt darin die Animation zunächst zu entfernen (auf Null zu setzen) und den Endwert der Animation danach noch einmal händisch zu übernehmen. Hierfür nutze ich einfach das Completed-Event

// Irgendeine Animation, z.B. eine Für das Margin Property
ThicknessAnimation _animation = new ThicknessAnimation(new Thickness(100,100, 0, 0), TimeSpan.FromSeconds(1));

// Wenn die Animation abgeschlossen ist
// kopiere ich den aktuell gehaltenen Wert in eine temporäre Variable,
// entferne dann die Animation von der DependencyProperty 
// und setze den Margin Wert händisch auf den gespeicherten Wert.
_animation.Completed += delegate
{
	var _thickness = (Thickness)mIcon.GetValue(MarginProperty);

	mIcon.BeginAnimation(MarginProperty, null);
	mIcon.Margin = _thickness;
};

// Animation starten
mIcon.BeginAnimation(MarginProperty, _animation);

// Irgendwann später Den Margin selbst setzen? 
// JETZT klappts endlich
mIcon.Margin = new Thickness(0)

Kolja Engelmann

Technikfan, Freizeitprogrammierer, selbsternannter Toolking und vermutlich größter Drachenfan Deutschlands blogged hier die Lösungen zu IT-Problemen die ihm über den Weg laufen, kleine Softwaretools, nostalgische Anfälle und missbraucht das Ganze gern auch mal als privates Tagebuch und Fotoalbum.

Das könnte dich auch interessieren …

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert