可湿性工作基金会.如何通过绑定停止数据触发动画
本文关键字:数据 动画 绑定 工作 基金会 何通过 可湿性 | 更新日期: 2023-09-27 17:50:38
在WPF工具包数据网格中,我有一个绑定到单元格元素不透明度的数据触发器。
当UpVisibility
变为 1 时,路径变为可见,动画开始将其淡化为 0。哪个有效。
但是我现在的问题 - 如果我需要过早停止/取消淡入淡出并将UpVisibility
设置为 0,则路径仍然可见并且褪色,因为什么也没发生......
如何使用MyValue对象立即将不透明度降至0?
<Path Data="M 5,0 0,10 10,10" Height="10" Width="10" Fill="Green" Opacity="{Binding MyValue[0].UpVisibility}" Margin="5,0,5,0">
<Path.Style>
<Style>
<Style.Triggers>
<DataTrigger Binding="{Binding MyValue[0].UpVisibility}" Value="1.0">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="Opacity" From="1.0" To="0.0" Duration="0:0:10" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Path.Style>
</Path>
故事板也可以使用DataTrigger
上的ExitAction
停止,当绑定值从目标状态更改时调用。只需为您的BeginStoryboard
命名,并在StopStoryboard
操作中引用它,如下所示:
<DataTrigger.EnterActions>
<BeginStoryboard Name="your_storyboard_name">
...
</BeginStoryboard>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<StopStoryboard BeginStoryboardName="your_storyboard_name" />
</DataTrigger.ExitActions>
这可能比启动第二个情节提要以停止或遮罩其他情节提要更合适。
您是否尝试过这样的事情(未经测试的示例(:
<Path Data="M 5,0 0,10 10,10" Height="10" Width="10" Fill="Green" Opacity="{Binding MyValue[0].UpVisibility}" Margin="5,0,5,0">
<Path.Style>
<Style>
<Style.Triggers>
<DataTrigger Binding="{Binding MyValue[0].UpVisibility}" Value="1.0">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="Opacity" From="1.0" To="0.0" Duration="0:0:10" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="Opacity" To="0.0" Duration="0:0:0" />
</Storyboard>
</BeginStoryboard>
</DataTrigger.ExitActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Path.Style>
</Path>
我将动画持续时间设置为 0 以即时。如果未定义 From 属性,则指示 WPF 从当前 DependencyProperty 值开始,因此它将顺利过渡。
如果需要在代码后面重置动画,通常执行这样的调用:
MyControl.BeginAnimation(OpacityProperty, null);
但是如何根据 MVVM 在 XAML 中做到这一点?答案是:
<Style>
<Style.Triggers>
<DataTrigger Binding="{Binding Vanishing}" Value="True">
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard TargetProperty="Opacity">
<DoubleAnimation To="0" Duration="0:0:0.5" FillBehavior="Stop"/>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<BeginStoryboard>
<Storyboard TargetProperty="Opacity">
<DoubleAnimation To="{x:Null}" Duration="0:0:0"/>
</Storyboard>
</BeginStoryboard>
</DataTrigger.ExitActions>
</DataTrigger>
</Style.Triggers>
</Style>
要在ViewModel中调用动画,我们可以执行以下操作:
Vanishing = true;
await Task.Delay(500);
Vanishing = false;
还要确保绑定属性(在我的情况下消失(调用 INotifyPropertyChanged 以通知视图有关新值的信息