【发布时间】:2010-12-11 21:06:58
【问题描述】:
有没有办法在 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>
在触发器的情节提要中使用它(对于每个状态 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>
您可以轻松想象我必须为所有这些数不胜数的 DataTrigger 反复复制和粘贴多少臃肿的 XAML。
一次定义所有这些触发器并将其应用于不同的状态视觉效果会很酷。在 WPF 中如何解决这样的问题?有什么建议吗?
【问题讨论】:
标签: wpf animation resources datatrigger reusability