【问题标题】:Run animation based on view model property?基于视图模型属性运行动画?
【发布时间】:2011-11-04 16:27:50
【问题描述】:

我正在尝试真正遵守 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 的 Loaded 事件中,并将我的屏幕结尾动画放在视图 XAML 的 UnLoaded 事件中。

我想分享这个以防其他人遇到类似问题 - 我不知道使用数据模板显示视图模型的视图的这种类型的行为。

【问题讨论】:

    标签: wpf binding mvvm storyboard contentpresenter


    【解决方案1】:

    这取决于您所追求的动画。例如,如果您想滑出当前视图然后滑入下一个视图,您可以简单地让您的控制视图模型引发两个事件:CurrentContentViewModelChangingCurrentContentViewModelChanged。您的视图可以根据这些事件触发适当的动画。

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

    【讨论】:

    • 感谢肯特的建议!在我发现 MVVM 以及数据模板如何真正简化我的问题之前,我正在查看这个和其他一些建议。该信息发布在下方。
    • 没关系,显然我无法在发布后 8 小时内回答我自己的问题...我将编辑我原来的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 2012-10-26
    相关资源
    最近更新 更多