如何创建一个动画的面板,只有在设定的时间后才触发它才会离开?

时间:2016-03-16 18:26:04

标签: .net wpf animation wpf-animation

我的视图中有一个简单的Border元素,其子项TextBlock绑定到一个字符串,表示我的应用程序中进程的状态。

我正在尝试为此边框设置动画,以便在修改TextBlock所绑定的字符串时滑入屏幕以便从屏幕外查看。

这是我到目前为止所做的:

<Border>
    <Border.Triggers>
        <EventTrigger RoutedEvent="Binding.TargetUpdated">
            <BeginStoryboard>
                <Storyboard>
                    <ThicknessAnimation Storyboard.TargetProperty="Margin" From="0,-100,0,0" To="0,0,0,0" DecelerationRatio=".9" Duration="0:0:1" />
                    <ThicknessAnimation Storyboard.TargetProperty="Margin" From="0,0,0,0" To="0,-100,0,0" AccelerationRatio=".9" BeginTime="0:0:5" Duration="0:0:1" />
                </Storyboard>
            </BeginStoryBoard>
        </EventTrigger>
    </Border.Triggers>
    <TextBlock Text="{Binding StatusText, Mode=OneWay, NotifyOnTargetUpdated=True}"></TextBlock>
</Border>

这可以按预期工作,但有两个问题我不知道如何解决:

  1. 每当文本发生变化时动画都会重新开始我不想这样做。我想要的是等待5秒钟,然后再滑开以重新启动。因此,如果文本不断更新,那么面板应保持静止,直到自上次更新后超过5秒,然后再向上滑动。
  2. 当应用程序启动时,立即播放动画。我猜是因为初始绑定算作更新。我该如何阻止这种情况发生?

1 个答案:

答案 0 :(得分:0)

考虑到您的数据位于ViewModel中,对于问题 1 ,我建议您使用DispatcherTimer每次StatusText更改时都会重新启动(您应该使用) INotifyPropertyChanged为此)。将DispatcherTimer.Interval设置为5000毫秒,当它变为Ticks时,然后开始动画以在屏幕外滑动边框。

现在的问题是因为你使用MVVM我知道应用动画的唯一方法是非常复杂的。

所以要手动应用动画(不是来自XAML,而是来自ViewModel),我建议创建一个继承自Border的自定义控件类,然后在XAML中创建自定义控件类的实例,最后触发“幻灯片”关闭屏幕“来自自定义控件类的动画。

要从ViewModel触发动画(位于自定义控件中),您可以在自定义控件类中包含DependencyProperty类型bool,当设置为true时将触发动画(右在动画启动之后,将依赖项属性的值更改回false,以便稍后可以通过再次将值更改为true来再次触发它。触发动画的此绑定使用TowWay模式非常重要,这样在启动动画时ViewModel中的属性也会设置为false。所以从技术上讲,View Model中的bool属性可以作为一个开关,在你翻转之后会立即自动关闭(类似于Minecraft中的按钮和控制杆)。

要解决问题 2 ,只需将另一个bool变量作为标记,以避免在第一次更改StatusText时触发动画。

P.S:我知道问题 1 的解决方案很复杂,但到目前为止,我发现在不破坏MVVM的情况下从ViewModel触发动画的唯一方法。