在 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...所以让我把它留在视图中。
我想移动一个无边框的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...所以让我把它留在视图中。