在 WPF 中并通过使用 Prism,如何使用 MouseButtonEventArgs 作为 window 命令的参数?

In WPF and by using Prism, how to use the MouseButtonEventArgs as a parameter of the command for a window?

我想移动一个无边框的windows,在采用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 可以为按钮等元素传递事件参数,但在我的情况下它不适用于 window。

谁能帮我解决这个问题?提前致谢。

I don't know how to implement this while using Prism

我不知道 this 应该是什么,但我假设它是 当视图发生:

最干净的选项是附加行为。或者,您可以使用支持转发参数的 InvokeCommandAction 变体,例如 DevExpress 的 EventToCommand

好吧,最后我触发了事件,但似乎这种方法与 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 模式的正确实现。

那么最好的 approach/practice 是什么?


看到这个回答我豁然开朗:

是的,移动 window 是一个 纯 UI 逻辑 ,因此没有必要将它移动到 ViewModel...所以让我把它留在视图中。