如何将 KeyEventArgs 参数传递给命令

How to pass KeyEventArgs parameters to the command

这是我的代码:

XAML:

<intr:Interaction.Triggers>
    <intr:EventTrigger EventName="KeyDown">
        <intr:InvokeCommandAction Command="{Binding KeyDownEvent}" />
    </intr:EventTrigger>
</intr:Interaction.Triggers>

代码:

public DelegateCommand<KeyEventArgs> KeyDownEvent { get; private set; }

public MainWindowViewModel()
{
        KeyDownEvent = new DelegateCommand<KeyEventArgs>(KeyDownEventHandler);
}

private void KeyDownEventHandler(KeyEventArgs args) //args is always null
{
    try
    {
        if (args.Key == Key.System && args.SystemKey == Key.F4)
        {
            args.Handled = true;
        }
    }
    catch (Exception ex)
    {

    }
}

当按下任意键时触发事件并调用 KeyDownEventHandler,但 args 参数始终为 null.

您必须将 PassEventArgsToCommand 属性 设置为 True

<intr:InvokeCommandAction Command="{Binding KeyDownEvent}"
                          PassEventArgsToCommand="True"/>

请注意,这是 Microsoft XAML behaviors NuGet package 中的 InvokeCommandAction。这是对旧版 Blend 行为 (System.Windows.Interactivity) 的替代。安装包后要使用的新 XML 命名空间是 http://schemas.microsoft.com/xaml/behaviors。您可以使用 EventArgsParameterPath.

在命令参数中指定 属性 路径

或者,如果您没有明确设置 CommandParameter,Prism 随附的 InvokeCommandAction 也会传递事件参数。它还允许在带有 TriggerParameterPath 的命令参数中指定 属性。有关详细信息,请参阅 documentation.

[...] the Prism InvokeCommandAction uses the EventArgs parameter passed to it from the parent trigger, passing it to the associated command if the CommandParameter is not set.

InvokeCommandAction 的旧变体不提供将事件参数传递给命令的选项。