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)