C# 在WPF中,通过使用Prism,如何使用MouseButtonEventArgs作为窗口命令的参数?
我想移动一个无边界窗口,在我采用Prism框架之前,我将按如下方式进行操作:C# 在WPF中,通过使用Prism,如何使用MouseButtonEventArgs作为窗口命令的参数?,c#,wpf,mvvm,prism,C#,Wpf,Mvvm,Prism,我想移动一个无边界窗口,在我采用Prism框架之前,我将按如下方式进行操作: public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); MouseDown += Window_MouseDown; } private void Window_MouseDown(object sender, MouseButtonE
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();
}
}
}
<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>
但是我不知道在MainWindowViewModel.cs(视图模型)中使用Prism时如何实现这一点,似乎InvokeCommandAction可以为按钮之类的元素传递事件参数,但在我的例子中,它不适用于窗口
有人能帮我吗?提前谢谢
我不知道在使用Prism时如何实现这一点
我不知道这到底应该是什么,但我假设它是在视图上发生某个事件时如何调用视图模型:
最干净的选项是附加的行为。或者,您可以使用一个
InvokeCommandAction
变量,比如DevExpress'EventToCommand
,它支持转发参数。好吧,最后我触发了事件,但这种方法似乎与MVVM模式的概念相矛盾,这要求视图模型不应该知道任何关于视图元素的信息,也不应该依赖于任何视图元素
在我的例子中,我可以将Interaction.Triggers添加到窗口中,并通过usngPrism的InvokeCommandAction将鼠标按钮传递到视图模型,如下所示:
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();
}
}
}
<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>
如果我想调用.DragMove(),我需要一个窗口的引用。。。这不是MVVM模式的正确实现
那么,这方面的最佳方法/实践是什么
当我看到这个答案时,我突然开悟了:
是的,移动窗口是一种纯UI逻辑,因此无需将其移动到ViewModel。。。因此,让我将其保留在视图中。您可以使用Attach属性。在stackI中观察这一点,我是说如何在窗口上使用InvokeCommandAction,您是否有示例代码?Prism的
InvokeCommandAction
不会传递参数。你可以把它放到
中。我做了类似的事情,但它对窗口不起作用:我不知道为什么它不起作用,但它现在起作用了,我的意思是,至少WindowMouseCommand可以被触发……不要严格按照这个模式。它被称为设计模式是有原因的,而不是理论或公式。如果你严格遵循每一个细节,你就会失去你的视角。我们有时不得不偏离设计模式是不是很常见@在编程中没有正确或错误的答案。我们了解所有这些模式以解决现有问题。归根结底,问题在于你如何用语言来解决问题。这就是为什么每个人都是独一无二的。你可能会从这篇文章中得到一些想法:“谢谢,这真是一篇鼓舞人心的文章。
private void WindowMouse(object mouseButton)
{
if (mouseButton is MouseButton m)
{
if (m == MouseButton.Left)
{
// DragMove();
}
}
}