我可以在 KeyUp 上使用 KeyBinding 吗?

Posted

技术标签:

【中文标题】我可以在 KeyUp 上使用 KeyBinding 吗?【英文标题】:Can I use KeyBinding on KeyUp? 【发布时间】:2012-06-19 10:28:55 【问题描述】:

有没有办法在 XAML 中使用 KeyBinding 并在 OnKeyUp 上执行命令?

如果我想绑定左 ALT 键来执行我自己的菜单访问命令,因为 KeyBinding 在 OnKeyDown 上执行命令,我会得到一些不需要的行为。例如,当使用Alt+Tab 跳出应用程序时,该命令将触发,如果按住该键,该命令将重新触发,直到释放该键。

我知道 ALT 是一个修饰键,有点特殊,但是通过等待 OnKeyUp 可以避免这些问题。

【问题讨论】:

您总是可以忽略常规命令并在需要时自行触发它。只需在必要时调用 CanExecute 和 Execute。 没错,但我仍然希望有一个干净的 XAML 解决方案,而不涉及代码隐藏。不过,前景看起来很黯淡。 :) 部分干净的 XAML 将是附加行为。但是你仍然需要一些代码。 【参考方案1】:

我通常使用 Attached Command Behavior 将命令连接到事件

在您只想在按下特定组合键时执行命令的特殊情况下,我建议同时连接KeyUp 事件和KeyUp 附加命令。

在常规的KeyUp事件中,检查你想要的组合键是否被按下,如果没有,将事件标记为Handled,这样它就不会被命令处理

例如,这将仅在按下 A 键时执行绑定命令

<TextBox acb:CommandBehavior.Command="Binding TestCommand"
         acb:CommandBehavior.Event="KeyUp"
         KeyUp="TextBox_KeyUp"/>

private void TextBox_KeyUp(object sender, KeyEventArgs e)

    if (e.Key != Key.A)
        e.Handled = true;

【讨论】:

我最终这样做了。我认为 KeyBinding 无法在 KeyUp 上触发是一个重大缺陷。不过,我不得不选择 e.SystemKey,因为 e.Key 在 Alt 和 Alg Gr 之间没有区别。 :)

以上是关于我可以在 KeyUp 上使用 KeyBinding 吗?的主要内容,如果未能解决你的问题,请参考以下文章

Wpf UserControl使用 KeyBinding,失效问题

如何在(keyup.enter)上关闭移动键盘 - Angular 6

WPF KeyBinding Key 可以有几个替代值吗?

Ctrl + Shift +零的WPF KeyBinding Guesture不起作用

jQuery Cleditor 在 keyup 上获取 textarea 值

keypress/keyup 在 chrome 移动浏览器上不起作用