使用多个修饰符键在 WPF 中创建 KeyBinding

我创建 KeyBinding的方法是这样的:

<KeyBinding Modifiers="Ctrl" Key="S" Command="{Binding SaveCommand}" />

但是如果我需要两个修饰符键呢? 例如,Ctrl + Shift

36734 次浏览
<KeyBinding Command="{Binding SaveCommand}"
Gesture="Ctrl+Shift+S" />

请参阅 MSDN 文档 KeyBinding Class < a href = “ https://msdn.microsoft.com/en-US/library/system.windows.input.KeyBinding.aspx”rel = “ nofollow noReferrer”> KeyBinding Class

文档指出,只需用 +字符分隔修饰符:

<KeyBinding Modifiers="Ctrl+Shift" Key="S" Command="{Binding SaveCommand}" />

给你的血淋淋的细节,与相关位提取下面的情况下链接曾经消失:


XAML

<object property="oneOrMoreModifierKeys"/>

XAML 值

oneOrMoreModifierKeysー由 ModifierKeys枚举定义的一个或多个修饰符键,用 +字符分隔。


你也可以自己使用手势而不是键/修饰符组合:

<KeyBinding Gesture="Ctrl+Shift+S" Command="{Binding SaveCommand}" />

根据同一文件链接:

在 XAML 中定义 KeyBinding 时,有两种方法来指定 KeyGesture。

在 XAML 中建立 KeyBinding 的第一种方法是定义 KeyBinding 元素的 Gesture 属性,该属性允许语法将键和修饰符指定为单个字符串,例如“ CTRL + P”。

第二种方法是定义 KeyBinding 元素的 Key 属性和修饰符属性。

设置 KeyGesture 的两种方法是等效的,并且可以修改相同的基础对象,但是如果两种方法都使用,则会产生冲突。在设置了键、修饰符和手势属性的情况下,最后定义的属性将用于 KeyGesture。

下面是实现多个字符快捷键的 我的原则,例如 WPF MVVM 中的 Alt + P + A

将此添加到 XAML(KeyDown 事件的附加行为) :

cb:ShortCutBehavior.Command="{Binding Shortcuts.CmdKeyPressed}"

将这个添加到视图模型中:

ShortCuts Shortcuts = new ShortCuts( this );


//Add Plenty of shortcuts here until your heart is desired


Shortcuts.AddDoubleLetterShortCut( AddOrganization, Key.P, Key.A, ModifierKeys.Alt, true);
Shortcuts.AddSingleLetterShortCut( CmdAddNewAgreement, Key.A, ModifierKeys.Alt);

这是两个添加快捷方式的例子。第一个是双字母快捷键: Alt + P + A,它运行 AddOrganization ()方法; 第二个是单字母快捷键: Alt + A,它执行 ICommand CmdAddNewAgreement。

AddDoubleLetterShortCut 和 AddSingleLetterShortCut 都超载以接受操作或 ICommand。

这是我第一次尝试概括一些东西,这样你就可以接受这个想法,使它适合你。

我知道这个问题是针对 XAML 的,但是如果你想用代码来做,这里有一个示例(可以通过逻辑 OR 指定多个修改器键) :

new KeyBinding( SaveCommand, Key.S, ModifierKeys.Control | ModifierKeys.Shift )

也许为时已晚,但这里有一个最简单、最短的解决方案。

private void Window_KeyDown(object sender, KeyEventArgs e)
{
if (Keyboard.Modifiers == ModifierKeys.Control && e.Key == Key.S)
{
// Call your method here
}
}


<Window x:Class="Test.MainWindow" KeyDown="Window_KeyDown" >