如何将 KeyEventArgs 参数传递给命令

Posted

技术标签:

【中文标题】如何将 KeyEventArgs 参数传递给命令【英文标题】:How to pass KeyEventArgs parameters to the command 【发布时间】:2021-05-20 13:03:51 【问题描述】:

这是我的代码:

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

【问题讨论】:

【参考方案1】:

您必须将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。

[...] Prism InvokeCommandAction 使用从父触发器传递给它的 EventArgs 参数,如果未设置 CommandParameter,则将其传递给关联的命令。

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

【讨论】:

PassEventArgsToCommand 属性给我错误:“在类型 'InvokeCommandAction' 中找不到属性 'PassEventArgsToCommand'。” @amirhossein 你的intr XML 命名空间是什么? xmlns:intr="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" @amirhossein 我已经用 Prism 的InvokeCommandAction 更新了答案。 谢谢!第一种方法效果很好!我认为这比第二种方式更好!但是,第二种方法对我不起作用!

以上是关于如何将 KeyEventArgs 参数传递给命令的主要内容,如果未能解决你的问题,请参考以下文章

如何将命令输出作为多个参数传递给另一个命令

如何将命令行参数传递给构建的 Mix Release

如何将命令行参数传递给 WinForms 应用程序?

如何将命令行参数传递给 c 程序

如何使用 Laravel 任务调度将参数传递给命令

如何将空参数传递给 msdeploy powershell deploy 命令