在 WPF 中并通过使用 Prism,如何使用 MouseButtonEventArgs 作为窗口命令的参数?
Posted
技术标签:
【中文标题】在 WPF 中并通过使用 Prism,如何使用 MouseButtonEventArgs 作为窗口命令的参数?【英文标题】:In WPF and by using Prism, how to use the MouseButtonEventArgs as a parameter of the command for a window? 【发布时间】:2020-03-06 10:59:02 【问题描述】:我想移动一个无边框的窗口,在我采用 Prism 框架之前,我会这样做:
public partial class MainWindow : Window
public MainWindow()
InitializeComponent();
MouseDown += Window_MouseDown;
private void Window_MouseDown(object sender, MouseButtonEventArgs e)
if (e.ChangedButton == MouseButton.Left)
DragMove();
但我不知道在 MainWindowViewModel.cs(视图模型)中使用 Prism 时如何实现这一点,似乎 InvokeCommandAction 可以将事件参数传递给像按钮这样的元素,但在我的情况下它不适用于窗口。
谁能帮我解决这个问题?提前致谢。
【问题讨论】:
您可以使用附加属性。在堆栈中观看此link 【参考方案1】:我不知道在使用 Prism 时如何实现这一点
我不知道 this 到底应该是什么,但我会假设它是 当视图上的某些事件发生时如何调用视图模型:
最干净的选项是附加行为。或者,您可以使用支持转发参数的 InvokeCommandAction
变体,例如 DevExpress 的 EventToCommand
。
【讨论】:
我的意思是如何在窗口上使用 InvokeCommandAction,你有示例代码吗? Prism 的InvokeCommandAction
不会传递参数。不过,您可以将其放入 <i:Interactivity.Behaviors>
。
我做了这样的事情,但它不适用于窗口: 好吧,最后我触发了事件,但似乎这种方法与 MVVM 模式的概念相矛盾,MVVM 模式要求视图模型不应该知道任何内容,也不应该依赖任何视图元素。
在我的例子中,我可以将 Interaction.Triggers 添加到 Window 并通过使用 Prism 的 InvokeCommandAction 将 MouseButton 传递给视图模型,如下所示:
<Window
xmlns:prism="http://prismlibrary.com/"
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
/>
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseDown">
<prism:InvokeCommandAction Command="Binding WindowMouseCommand" TriggerParameterPath="ChangedButton" />
</i:EventTrigger>
</i:Interaction.Triggers>
在视图模型中:
public DelegateCommand<object> WindowMouseCommand get; private set;
...
WindowMouseCommand = new DelegateCommand<object>(WindowMouse);
...
private void WindowMouse(object mouseButton)
if (mouseButton is MouseButton m)
if (m == MouseButton.Left)
// DragMove();
如果我想调用 .DragMove(),我需要 Window 的引用...这不是 MVVM 模式的正确实现。
那么,最好的方法/实践是什么?
看到这个答案我顿时豁然开朗: https://***.com/a/3426183/10958770
是的,移动一个窗口是一个纯 UI 逻辑,因此没有必要将它移动到 ViewModel...所以让我把它留在视图中。
【讨论】:
不要严格按照模式。它被称为设计模式是有原因的,而不是理论或公式。如果你严格遵守每一个细节,你就会失去你的视角。 我们有时不得不偏离设计模式是否很常见? @phonemyatt 编程没有对错之分。我们了解所有这些模式以解决现有问题。归根结底,关键在于你如何说语言来解决问题。这就是为什么每个人都是独一无二的。你可能会从这篇文章中得到一些想法:“neverindoubtnet.blogspot.com/2010/03/mvvm-josh-smiths-way.html”, 谢谢,这真是一篇鼓舞人心的文章。以上是关于在 WPF 中并通过使用 Prism,如何使用 MouseButtonEventArgs 作为窗口命令的参数?的主要内容,如果未能解决你的问题,请参考以下文章
WPF Step By Step 系列5-Prism框架在项目中使用
WPF - Prism 7.1 - 导航 - 掌握选项卡控件 - 模态/对话框窗口