如何将 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 参数传递给命令的主要内容,如果未能解决你的问题,请参考以下文章