基于视图模型属性运行动画?

时间:2011-11-04 16:27:51

标签: wpf binding mvvm storyboard contentpresenter

我正在尝试真正坚持MVVM模式,因此我很难弄清楚如何在每次设置视图模型上的某个属性时触发视图上的动画(通过绑定)。

在我的MainWindow.xaml中,我有一个ContentPresenter,我将该演示者的内容绑定到显示给用户的当前视图的视图模型。例如,当用户首次运行应用程序时,ContentPresenter将绑定到StartViewModel。例如,如果用户点击将他/她带到不同屏幕的按钮来运行研究,则需要将ContentPresenter绑定到StudyViewModel,以便可以显示StudyView屏幕。然后,如果用户希望返回到开始屏幕,那么此时的ContentPresenter将再次绑定到应用程序启动时创建的StartViewModel。它看起来像这样:

<Window
...
  <Grid
  ...
        <ContentControl
            x:Name="CurrentContentView"
            Width="Auto"
            Grid.Row="2" 
            Content="{Binding CurrentContentViewModel}" />
  </Grid>
</Window>

CurrentContentViewModel的类型为“ViewModelBase”,它是我为实现INotifyPropertyChanged的所有视图模型创建的基类。我在后台保留了一个ViewModelBase的ObservableCollection,每当发生一些事件导致用户进入新的屏幕时,我会在该集合中查找相应的视图模型,并将CurrentContentViewModel设置为该视图模型。如果它在我的集合中还不存在,我首先将它添加到集合中,然后将CurrentContentViewModel设置为该视图模型。

我的问题是:每次显示视图时,如何让我的视图运行“简介”动画?每次在ContentPresenter中简单地加载视图时,我都无法设置要运行的故事板,因为我还想在用户返回到之前在应用程序生命周期中已加载的视图时再次运行动画。最重要的是,我的视图是“愚蠢的”,并且不知道它已经再次显示在MainWindow中,因为我的MainWindow上的ContentPresenter被绑定到视图模型而不是视图(所以它几乎就像VIEW MODEL一样每次绑定到内容演示者并且视图必须响应该事件时,必须触发一些事件。有没有办法可以声明某种原始类型,比如我的xaml标记中的布尔值,它可以绑定到我的视图模型中的布尔值?

提前感谢任何人可能提出的任何想法,如果已经提出这个问题,我很抱歉。我发现了一些类似的帖子,但没有什么比我想做的更好。

更新 - 解决方案

事实证明(至少在我目前的实施中),这是一个比我意识到的更容易解决的问题。如果使用数据模板模式构建视图(即在资源字典中为每个视图模型定义数据模板,然后将该资源字典添加到app.xaml文件的资源列表中),则每次都会重新创建视图它将从内容控件中删除。在我的情况下,每次我将内容控件的内容绑定到与前一个不同的视图模型时,为该视图模型“构建”的视图实际上被处理掉了。然后,当视图模型再次重新分配给内容控件时,视图将重新构建。因此,我可以在视图XAML的UnLoaded事件的视图XAML和我的屏幕outro动画的Loaded事件中放置我的屏幕介绍动画。

我希望在其他人遇到类似问题的情况下分享这一点 - 我不知道这种行为使用数据模板来显示视图模型的视图。

1 个答案:

答案 0 :(得分:1)

这取决于你追求的动画。例如,如果要滑出当前视图,然后在下一个视图中滑动,则只需让控制视图模型引发两个事件:CurrentContentViewModelChangingCurrentContentViewModelChanged。您的视图可以根据这些事件触发适当的动画。

但是,如果您的动画需要与旧视图同时显示新视图,则事情会变得有点棘手。您需要在新视图的同时公开旧视图,或者需要视图在替换新视图之前拍摄旧视图的快照。再次,您应该能够使用相同的事件来实现这一目标。