Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在WPF中,通过使用Prism,如何使用MouseButtonEventArgs作为窗口命令的参数?_C#_Wpf_Mvvm_Prism - Fatal编程技术网

C# 在WPF中,通过使用Prism,如何使用MouseButtonEventArgs作为窗口命令的参数?

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

我想移动一个无边界窗口,在我采用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();
        }
    }
}
<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();
        }
    }
}