我正在尝试使用简单的WPF应用程序来使用Model-View-ViewModel模式。在我的页面上,我有几个动画:
<Page.Resources>
<Storyboard x:Name="storyboardRight"
x:Key="storyboardRight">
<DoubleAnimation x:Name="da3"
Storyboard.TargetName="labelRight"
Storyboard.TargetProperty="Opacity"
From="0"
To="1"
Duration="0:0:0.5" />
<DoubleAnimation x:Name="da4"
Storyboard.TargetName="labelRight"
Storyboard.TargetProperty="Opacity"
From="1"
To="0"
BeginTime="0:0:1"
Duration="0:0:0.5" />
</Storyboard>
...
</Page.Resources>
目前我在后面的代码中开始动画,并且可以使用以下代码监听Completed事件以完成某些操作:
storyboardRight = (Storyboard)TryFindResource("storyboardRight");
storyboardRight.Completed += new EventHandler(storyboardRight_Completed);
storyboardRight.Begin(this);
有没有一种方法可以将故事板绑定到我的ViewModel,以便它在ViewModel引发的事件上启动,并在完成时可以回调到该ViewModel?
答案 0 :(得分:9)
我有机会把这个问题提交给微软的Josh Twist,他花了很多时间来解决这个问题。解决方案是使用DataTrigger
与ViewModel中的枚举组合来启动Storyboard,这反过来又要求将页面放入ContentPresenter
。为了处理动画完成,需要少量代码才能在ViewModel上调用ICommand
。
阅读Josh的帖子here以获得解决方案的完整描述。
答案 1 :(得分:2)
我是通过使用DataTrigger并将其绑定到我的ViewModel中的属性来实现的。当“FlashingBackGround”属性设置为“ON”时,Storyboard动画开始。
还要确保在项目中包含对“Microsoft.Expression.Interactions”
的引用XAML :(这直接在根节点中)
<Window
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
x:Name="window" >
...
<i:Interaction.Triggers>
<ei:DataTrigger Binding="{Binding FlashingBackground, Mode=OneWay}" Value="ON">
<ei:ControlStoryboardAction Storyboard="{StaticResource MyAnimation}"
ControlStoryboardOption="Play"/>
</ei:DataTrigger>
</i:Interaction.Triggers>
...
</Window>
视图模型:
private void TurnOnFlashingBackround()
{
this.FlashingBackground = "ON";
}
private string _FlashingBackround = "OFF";
public string FlashingBackground
{
get { return this._FlashingBackround; }
private set
{
if (this.FlashingBackground == value)
{
return;
}
this._FlashingBackround = value;
this.OnPropertyChanged("FlashingBackground");
}
}
public new event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(
this,
new PropertyChangedEventArgs(propertyName));
}
}
最后,Viewmodel必须继承“INotifyPropertyChanged”
答案 2 :(得分:1)
您需要使用EventTrigger
。这article about Animations in WPF可能有所帮助。另请参阅MSDN上的Routed Events Overview和How to: Use Event Triggers to Control a Storyboard After It Starts。