将动画和触发器定义为可重用资源?

bit*_*onk 13 wpf resources animation datatrigger reusability

有没有办法在xaml中某处定义动画(例如作为资源),然后多次重复使用?我在不同的数据模板上有很多独立的画笔,它们独立地需要基于数据触发器来启动相同类型的动画.现在,因为动画似乎必须定义Storyboard.TargetName和Storyboard.TargetProperty.这几乎违背了可重用性的目的.我想以某种方式宣称"使用此动画形成资源,但这次将其应用于另一个元素".

对我来说,这似乎是一个相当基本,重要和必要的要求,我很惊讶它不是那么直截了当地表达的.我在这里错过了什么吗?

同样的事情适用于触发器.假设我有许多不同的视觉元素,它们都使用颜色动画表示相同类型的状态.例如,当"活动"在"错误"等时淡入"红色"时淡入绿色.视觉效果之间的唯一区别是它们的形状/视觉树所需的动画行为是相同的,它们在视觉树中的某处都有一个元素具有颜色类型的属性.我认为不难想象一遍又一遍地重新定义相同的动画和数据触发器是多么乏味.每个开发人员都讨厌这个.我拼命寻求一种更简单的解决方案,不需要(或至少很少)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>
Run Code Online (Sandbox Code Playgroud)

在触发器的故事板中使用它(对于每个状态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>
Run Code Online (Sandbox Code Playgroud)

您可以很容易地想象我必须为所有那些数以万计的DataTriggers重复复制和粘贴多少臃肿的XAML.

定义所有这些触发器并将其应用于不同的状态视觉效果会很酷.在WPF中如何解决这样的问题?有提示吗?

bit*_*onk 1

对于这个普遍问题,似乎没有任何好的仅 XAML 解决方案。我最终编写了自己的附加属性来定义给定元素的所有动画行为。像这样的东西:

<DataTemplate>
   <!-- ...  -->
   <Rectangle Fill="Gray">
     <v:AnimationHelper.Animations>
        <v:StandardColorStateAnimation TargetColorProperty="(Rectangle.Fill).(SolidColorBrush.Color)" TargetStateProperty={Binding State} />
     </v:AnimationHelper.Animations>
   </Rectangle>
<DataTemplate>
Run Code Online (Sandbox Code Playgroud)

其余的(创建动画等)在代码隐藏中完成。