WPF如何通过属性变更触发StoryBoard动画?
如何通过属性变更启动Storyboard实现背景动画
EventTrigger是用来响应路由事件的,没法直接绑定属性变更。要实现属性变化时触发动画,有两种常用方案:
方案1:用WPF原生的Trigger/DataTrigger
如果要监听目标控件的依赖属性变化(比如自定义属性、现有控件属性),可以用Trigger或DataTrigger的EnterActions来启动Storyboard。
示例:监听自定义属性变更
假设你给Label加了一个自定义依赖属性ShouldAnimateBackground,修改后的触发器代码如下:
<ControlTemplate.Triggers> <!-- 当ShouldAnimateBackground属性变为True时触发动画 --> <Trigger Property="local:CustomLabel.ShouldAnimateBackground" Value="True"> <Trigger.EnterActions> <BeginStoryboard> <Storyboard> <DoubleAnimation Storyboard.TargetName="BackgroundBorder" Storyboard.TargetProperty="Opacity" From="0" To="1" Duration="0:0:2"/> </Storyboard> </BeginStoryboard> </Trigger.EnterActions> <!-- 可选:属性变回False时重置动画 --> <Trigger.ExitActions> <BeginStoryboard> <Storyboard> <DoubleAnimation Storyboard.TargetName="BackgroundBorder" Storyboard.TargetProperty="Opacity" To="0" Duration="0:0:0.5"/> </Storyboard> </BeginStoryboard> </Trigger.ExitActions> </Trigger> </ControlTemplate.Triggers>
监听属性的任何变更(无特定值要求)
如果只要属性发生变化就触发(不管值是什么),可以用DataTrigger结合绑定,覆盖属性可能的常见值:
<ControlTemplate.Triggers> <DataTrigger Binding="{Binding YourTargetProperty, RelativeSource={RelativeSource TemplatedParent}, UpdateSourceTrigger=PropertyChanged}" Value="{x:Null}"> <DataTrigger.EnterActions> <BeginStoryboard> <Storyboard> <DoubleAnimation Storyboard.TargetName="BackgroundBorder" Storyboard.TargetProperty="Opacity" From="0" To="1" Duration="0:0:2"/> </Storyboard> </BeginStoryboard> </DataTrigger.EnterActions> </DataTrigger> <DataTrigger Binding="{Binding YourTargetProperty, RelativeSource={RelativeSource TemplatedParent}, UpdateSourceTrigger=PropertyChanged}" Value="{x:Static sys:String.Empty}"> <DataTrigger.EnterActions> <BeginStoryboard> <Storyboard> <DoubleAnimation Storyboard.TargetName="BackgroundBorder" Storyboard.TargetProperty="Opacity" From="0" To="1" Duration="0:0:2"/> </Storyboard> </BeginStoryboard> </DataTrigger.EnterActions> </DataTrigger> <!-- 可继续补充属性可能的其他值 --> </ControlTemplate.Triggers>
方案2:使用PropertyChangedTrigger(需Blend SDK)
如果你的项目可以引用System.Windows.Interactivity(Blend SDK组件),可以直接用PropertyChangedTrigger监听属性变更,写法更简洁:
- 先在XAML头部添加命名空间:
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
- 修改触发器部分:
<ControlTemplate.Triggers> <i:EventTrigger> <i:EventTrigger.Actions> <BeginStoryboard> <Storyboard> <DoubleAnimation Storyboard.TargetName="BackgroundBorder" Storyboard.TargetProperty="Opacity" From="0" To="1" Duration="0:0:2"/> </Storyboard> </BeginStoryboard> </i:EventTrigger.Actions> <i:EventTrigger.Trigger> <i:PropertyChangedTrigger Binding="{Binding YourTargetProperty, RelativeSource={RelativeSource TemplatedParent}}"/> </i:EventTrigger.Trigger> </i:EventTrigger> </ControlTemplate.Triggers>
这种方式会在YourTargetProperty属性任何值变更时自动触发动画,无需指定具体值。
内容的提问来源于stack exchange,提问作者user23469364
相关产品推荐
相关产品推荐

