可湿性工作基金会.如何通过绑定停止数据触发动画

本文关键字:数据 动画 绑定 工作 基金会 何通过 可湿性 | 更新日期: 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 以通知视图有关新值的信息