我的视图中有一个简单的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>
这可以按预期工作,但有两个问题我不知道如何解决:
答案 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触发动画的唯一方法。