{"id":4420,"date":"2015-09-22T16:26:23","date_gmt":"2015-09-22T14:26:23","guid":{"rendered":"https:\/\/www.kolja-engelmann.de\/blog\/?p=4420"},"modified":"2015-09-22T16:26:23","modified_gmt":"2015-09-22T14:26:23","slug":"c-dependencyproperty-nach-einer-animation-wieder-haendisch-aendern","status":"publish","type":"post","link":"https:\/\/www.kolja-engelmann.de\/blog\/2015\/09\/c-dependencyproperty-nach-einer-animation-wieder-haendisch-aendern\/","title":{"rendered":"[C#] DependencyProperty nach einer Animation wieder h\u00e4ndisch \u00e4ndern"},"content":{"rendered":"<p>Mal wieder eine dieser Stolperfallen auf die ich immer und immer wieder reinfalle. Animiere ich in einer meiner Oberfl\u00e4chen eine DependencyProperty (z.B. Width, Height, Margin, Opacity usw.) und versuche diese irgendwann sp\u00e4ter h\u00e4ndisch auf einen anderen Wert zu setzen, dann wird meine \u00c4nderung ignoriert und stoisch der letzte Wert der Animation gehalten. Das Verhalten ist zwar extrem nervig, aber dennoch korrekt, wenn man die <a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/vstudio\/ms743230%28v=vs.100%29.aspx#listing\" target=\"_blank\">DependencyProperty Pr\u00e4zedenzliste<\/a> stets im Hinterkopf beh\u00e4lt. Diese definiert n\u00e4mlich welchen Wert eine DependencyProperty letztendlich besitzt, wenn deren Wert an unterschiedlichen Stellen gesetzt wurde (z.B. Template, Style, lokale Wertzuweisung oder eben Animation).<\/p>\n<pre class=\"lang:c# decode:true\">\/\/ Irgendeine Animation, z.B. eine f\u00fcr das Margin Property\r\nThicknessAnimation _animation = new ThicknessAnimation(new Thickness(100,100, 0, 0), TimeSpan.FromSeconds(1));\r\n\r\n\/\/ Animation starten\r\nmIcon.BeginAnimation(MarginProperty, _animation);\r\n\r\n\/\/ Irgendwann sp\u00e4ter Den Margin selbst setzen? \r\n\/\/ Pff, vergiss es\r\nmIcon.Margin = new Thickness(0)<\/pre>\n<p>Da eine Animation eine h\u00f6here Pr\u00e4zedenz hat als mein lokal gesetzter Wert, kann ich hier so lange fluchen wie ich will, mein Margin bleibt auf (100,100,0,0).<\/p>\n<p>Die L\u00f6sung des Problems liegt darin die Animation zun\u00e4chst zu entfernen (auf Null zu setzen) und den Endwert der Animation danach noch einmal h\u00e4ndisch zu \u00fcbernehmen. Hierf\u00fcr nutze ich einfach das Completed-Event<\/p>\n<pre class=\"lang:c# decode:true\">\/\/ Irgendeine Animation, z.B. eine F\u00fcr das Margin Property\r\nThicknessAnimation _animation = new ThicknessAnimation(new Thickness(100,100, 0, 0), TimeSpan.FromSeconds(1));\r\n\r\n\/\/ Wenn die Animation abgeschlossen ist\r\n\/\/ kopiere ich den aktuell gehaltenen Wert in eine tempor\u00e4re Variable,\r\n\/\/ entferne dann die Animation von der DependencyProperty \r\n\/\/ und setze den Margin Wert h\u00e4ndisch auf den gespeicherten Wert.\r\n_animation.Completed += delegate\r\n{\r\n\tvar _thickness = (Thickness)mIcon.GetValue(MarginProperty);\r\n\r\n\tmIcon.BeginAnimation(MarginProperty, null);\r\n\tmIcon.Margin = _thickness;\r\n};\r\n\r\n\/\/ Animation starten\r\nmIcon.BeginAnimation(MarginProperty, _animation);\r\n\r\n\/\/ Irgendwann sp\u00e4ter Den Margin selbst setzen? \r\n\/\/ JETZT klappts endlich\r\nmIcon.Margin = new Thickness(0)<\/pre>","protected":false},"excerpt":{"rendered":"<p>Mal wieder eine dieser Stolperfallen auf die ich immer und immer wieder reinfalle. Animiere ich in einer meiner Oberfl\u00e4chen eine DependencyProperty (z.B. Width, Height, Margin, Opacity usw.) und versuche diese irgendwann sp\u00e4ter h\u00e4ndisch auf einen&#46;&#46;&#46;<\/p>\n","protected":false},"author":1,"featured_media":4421,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[38],"tags":[39,40],"class_list":["post-4420","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codeschnippsel","tag-c","tag-wpf"],"jetpack_featured_media_url":"https:\/\/www.kolja-engelmann.de\/blog\/wp-content\/uploads\/2015\/09\/dependencyproperty-remove-animation.png","jetpack_sharing_enabled":true,"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.kolja-engelmann.de\/blog\/wp-json\/wp\/v2\/posts\/4420","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kolja-engelmann.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.kolja-engelmann.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.kolja-engelmann.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kolja-engelmann.de\/blog\/wp-json\/wp\/v2\/comments?post=4420"}],"version-history":[{"count":0,"href":"https:\/\/www.kolja-engelmann.de\/blog\/wp-json\/wp\/v2\/posts\/4420\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.kolja-engelmann.de\/blog\/wp-json\/wp\/v2\/media\/4421"}],"wp:attachment":[{"href":"https:\/\/www.kolja-engelmann.de\/blog\/wp-json\/wp\/v2\/media?parent=4420"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.kolja-engelmann.de\/blog\/wp-json\/wp\/v2\/categories?post=4420"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.kolja-engelmann.de\/blog\/wp-json\/wp\/v2\/tags?post=4420"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}