繁体   English   中英

WPF。 如何通过绑定来停止数据触发动画?

[英]WPF. How to stop data trigger animation through binding?

在WPF工具包datagrid中,我有一个数据触发器绑定到单元格元素的不透明度。

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>

也可以使用ExitAction上的DataTrigger停止故事板,当绑定值更改超出目标状态时,将调用它。 只需为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来通知视图有关新值

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM