Gibt es eine Möglichkeit, eine Animation irgendwo in XAML (zB als Ressource) einmal zu definieren und sie dann mehrfach zu verwenden? Ich habe viele unabhängige Pinsel über verschiedene Datatemplates, die unabhängig voneinander die gleiche Art von Animation basierend auf einem Datentrigger starten müssen. Jetzt scheint es so zu sein, dass eine Animation ein Storyboard.TargetName und Storyboard.TargetProperty definieren muss. Dies widerlegt ziemlich genau den Zweck der Wiederverwendbarkeit. Ich würde irgendwie gerne erklären "benutze diese Animation als Ressource, aber wende es diesmal auf ein anderes Element an".Definieren Sie Animationen und Trigger als wiederverwendbare Ressource?
Für mich scheint dies eine ziemlich grundlegende, wichtige und wesentliche Anfrage zu sein, und ich bin überrascht, dass es nicht so direkt zu acomplish ist. Fehle ich hier etwas?
Das gleiche gilt für Trigger. Angenommen, ich habe viele verschiedene visuelle Elemente, die alle die gleiche Art von Zustand mit Farbanimationen darstellen. Z.B. Fade zu Grün, wenn "aktiv" zu "rot" verblasst, wenn "Fehler" usw. Der einzige Unterschied zwischen den Visuals ist ihre Form/visueller Baum das gewünschte Animationsverhalten ist das gleiche, sie alle haben ein Element irgendwo in ihrem visuellen Baum, der hat eine Eigenschaft vom Typ Farbe. Ich denke, es ist nicht schwer sich vorzustellen, wie mühsam es ist, die gleichen Animationen und Datentriggersätze immer wieder neu zu definieren. Jeder Entwickler hasst dies. Ich suche verzweifelt nach einer einfacheren Lösung, die keinen (oder zumindest sehr wenig) C# Code benötigt.
Was ich mit so weit gekommen sind, ist dies:
Definieren Sie die Animationen in einer Ressource lik diese (dies wiederholen für alle Grundzustände, dass es, wie die Aktivierung, aktiv, inaktiv, Fehler):
<ColorAnimationUsingKeyFrames x:Key="deactivatingColorAnimation"
Storyboard.TargetProperty="Material.(MaterialGroup.Children)[0].Brush.(SolidColorBrush.Color)"
FillBehavior="HoldEnd" RepeatBehavior="Forever" AutoReverse="True">
<ColorAnimationUsingKeyFrames.KeyFrames>
<LinearColorKeyFrame KeyTime="00:00:00" Value="Gray"/>
<LinearColorKeyFrame KeyTime="00:00:0.25" Value="Gray"/>
<LinearColorKeyFrame KeyTime="00:00:0.5" Value="Gray" />
<LinearColorKeyFrame KeyTime="00:00:0.75" Value="Gray" />
</ColorAnimationUsingKeyFrames.KeyFrames>
</ColorAnimationUsingKeyFrames>
die Verwendung es in Storyboard in den Auslösern (wiederholen sie diese zig Millionen mal für jeden Zustand X jeden differnt stateviusal, immer mit einem neuen Namen für das Storyboard kommen):
<DataTrigger Binding="{Binding SubstrateHolder.State}" Value="Deactivating">
<DataTrigger.EnterActions>
<BeginStoryboard x:Name="someStateVisualDeactivatingStoryboard">
<Storyboard Storyboard.TargetName="someStateVisual">
<StaticResource ResourceKey="deactivatingColorAnimation" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<RemoveStoryboard BeginStoryboardName="someStateVisualDeactivatingStoryboard" />
</DataTrigger.ExitActions>
</DataTrigger>
Sie können sich leicht vorstellen, wie viel Bloat XAML ich für all diese zig DataTriggers kopieren und einfügen muss.
Es wäre cool, alle diese Trigger einmal zu definieren und sie auf verschiedene Zustandsbilder anzuwenden. Wie ist so etwas in WPF gelöst? Irgendwelche Trinkgeld?
Ich weiß, ich habe eine Menge verschiedener Dinge ausprobiert, um einen Vorschlag dafür zu finden, und es war einfach nicht möglich, ohne etwas im Code zu tun. Das ist so eine gute Lösung, wie ich denke, du wirst es bekommen. Hurra für WPF Erweiterbarkeit, oder? :) –
Es könnte eine gute Idee sein, die silverlight Verhaltens-API dafür zu verwenden. Sind Sie einverstanden? Ist es kompatibel mit dem Standard-.NET-Framework? – bitbonk
Nein, es ist nicht kompatibel, obwohl sie angenommen werden. Ehrlich gesagt, denke ich, dass Sie eine großartige Lösung gefunden haben, die die WPF-Architektur auf eine sehr "natürliche" Art und Weise nutzt und sich hier nicht selbst raten sollte. –