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