从视图模型 (WPF) 调用视图中的动画

Posted

技术标签:

【中文标题】从视图模型 (WPF) 调用视图中的动画【英文标题】:Calling animations in a view from a viewmodel (WPF) 【发布时间】:2013-11-06 16:12:16 【问题描述】:

我所拥有的:一个包含动画定义和一个视图定义的样式资源,一个包含数据、属性和 ICommand 的视图模型。

目前,该应用程序可以通过按钮单击(使用 ICommand)调用 VM 函数、绑定到 VM 属性的视图,并且它能够从 button.click 事件触发器运行动画。

我想要做什么; 如果将样式应用于列表框(例如)如何直接从 VM 触发动画? IE。如果数据的某些属性发生变化,是否有可能导致动画运行?我知道我可以使用 UserControl 来做到这一点,但我正试图将我的程序分成更明确定义的视图和视图模型。我不想在我的视图中显示代码,我也不想在我的虚拟机中显示动画。

【问题讨论】:

欢迎来到 Stack Overflow!看起来您希望我们为您编写一些代码。虽然许多用户愿意为陷入困境的编码人员编写代码,但他们通常只有在发布者已经尝试自己解决问题时才会提供帮助。展示这项工作的一个好方法是包含您迄今为止编写的代码、示例输入(如果有的话)、预期输出和您实际获得的输出(控制台输出、堆栈跟踪、编译器错误 - 不管是什么适用的)。您提供的详细信息越多,您可能收到的答案就越多。检查FAQ 和How to Ask 那不是 mvvm。只需在代码隐藏中完成您的 UI 工作即可。 【参考方案1】:

当您说 它能够从 button.click 事件触发器运行动画时,您几乎回答了自己的问题。实际答案是肯定的,您可以使用绑定到视图模型属性的数据的DataTrigger 启动动画,或者使用自定义RoutedEvent 以相同方式使用EventTrigger 启动动画:

<Style>
    <Style.Triggers>
        <DataTrigger Binding="Binding IsAnimationRunning" Value="True">
            <DataTrigger.EnterActions>
                <BeginStoryboard>
                    <Storyboard>
                        <SomeAnimation />
                    </Storyboard>
                </BeginStoryboard>
            </DataTrigger.EnterActions>
        </DataTrigger>
    </Style.Triggers>
</Style>

这将在 IsAnimationRunning 属性从 false 更改为 true 时启动动画。

【讨论】:

【参考方案2】:

编辑:在进一步研究中,我认为您需要的是:WPF Command with Click Event Handler

这个想法是您应该在事件中调用 ICommand,从而允许进一步的事件订阅。它仍然感觉很混乱,因为它几乎忽略了标准的命令绑定语法,但它相当于同一件事,因为命令绑定仍在视图中。

【讨论】:

这个答案应该是一个评论,虽然我没有给你投反对票。 @Sheridan:已修复,答案确实有效。没有意识到 ICommand 停止了点击事件。 在这个网站上,像你这样的简短回答通常是不受欢迎的。通常优选将一些链接页面包含在答案中以提供一些上下文。请参阅Help pages 的“为链接提供上下文”部分了解更多信息。

以上是关于从视图模型 (WPF) 调用视图中的动画的主要内容,如果未能解决你的问题,请参考以下文章

从视图模型中将焦点设置在 WPF 中的 TextBox 上

如何从作为wpf mvvm模式中的窗口打开的视图模型中关闭用户控件?

wpf数据绑定发生时如何显示加载图形/动画

视图模型应该对视图控制器中的事件做出反应吗?

如何从 mvvm 中的视图模型关闭视图?

如何从其他视图模型调用主视图模型中的函数?