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

时间:2010-10-29 08:02:29

标签: wpf

我创建KeyBinding的方式如下:

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

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

5 个答案:

答案 0 :(得分:111)

文档说明您可以将修饰符与+字符分开:

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

有关详细信息,请参阅here,如果链接消失,请在下面提取相关位:


<强> 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属性和Modifiers属性。

     

设置KeyGesture的两种方式都是等效的,并修改相同的底层对象,但如果两者都使用则会发生冲突。在设置Key,Modifiers和Gesture属性的情况下,最后定义的属性将用于KeyGesture。

答案 1 :(得分:14)

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

请参阅MSDN文档 KeyBinding Class

答案 2 :(得分:5)

我知道问题出在XAML上,但如果您想在代码中执行此操作,可以使用以下示例(可以通过逻辑OR指定多个ModifierKeys):

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

答案 3 :(得分:2)

这是my code在WPF MVVM中实现多个字符快捷键,例如 Alt + P + A 。< / p>

将此添加到您的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 CmdAddNewAgreemnt。

重载AddDoubleLetterShortCut和AddSingleLetterShortCut以接受操作或ICommands。

这是我第一次尝试创造某种东西,所以你可以接受这个想法,让它适合你。

答案 4 :(得分:0)

可能为时已晚,但这是最简单,最短的解决方案。

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" >