Есть ли способ определить анимацию где-нибудь в xaml (например, как ресурс) один раз, а затем повторно использовать ее несколько раз? У меня есть много независимых кистей для разных шаблонов данных, которые независимо друг от друга должны запускать анимацию одного и того же типа, основанную на датгергере. Теперь, поскольку кажется, что анимация должна определять Storyboard.TargetName и Storyboard.TargetProperty. Это в значительной степени побеждает цель повторного использования. Я хотел бы как-то объявить «использовать эту анимацию из ресурса, но на этот раз применить ее к другому элементу».
Мне кажется, это довольно простой, важный и важный запрос, и я удивлен, что его не так уж и легко выполнить. Я что-то здесь упускаю?
То же самое относится и к триггерам. Предположим, у меня есть много разных визуальных элементов, которые все представляют один и тот же тип состояния, используя цветную анимацию. Например. исчезают до зеленого, когда «активный», переходят в «красный», когда «ошибка» и т. д. Единственное различие между визуалами состоит в том, что их дерево форм / визуалов имеет одинаковое желаемое поведение анимации, все они имеют элемент где-то в своем дереве визуалов, который имеет свойство типа color. Я думаю, нетрудно представить, насколько утомительно пересматривать одни и те же анимации и наборы данных снова и снова. Каждый разработчик ненавидит это. Я отчаянно ищу более простое решение, которое не требует (или, по крайней мере, очень мало) кода C # позади.
То, что я до сих пор придумал, это:
Определите анимации в ресурсе, например: (повторите это для всех основных состояний, таких как активация, активация, неактивность, ошибка):
<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>
Используйте его в раскадровке в триггерах (повторяйте это миллионы раз для каждого состояния X каждого отдельного состояния, всегда придумывайте новое имя для раскадровки):
<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>
Вы можете легко представить, сколько раздуваемого XAML мне приходится многократно копировать и вставлять для всех этих миллиардов DataTriggers.
Было бы здорово определить все эти триггеры один раз и применить их к различным визуальным состояниям. Как что-то подобное решается в WPF? Любой совет?