【问题标题】:Creating KeyBinding in WPF with more than one modifier key使用多个修饰键在 WPF 中创建 KeyBinding
【发布时间】:2011-05-02 07:02:24
【问题描述】:

我创建KeyBinding 的方式类似于:

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

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

【问题讨论】:

    标签: wpf


    【解决方案1】:

    文档指出,您可以使用 + 字符分隔修饰符:

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

    【讨论】:

    • Microsoft Docs: XAML Syntax In Detail - Enumeration Attribute Values: " KeyBinding.Modifiers ...这个属性恰好是一个特例,因为 ModifierKeys 枚举支持它自己的类型转换器。修饰符的类型转换器使用加号 (+) 作为分隔符而不是逗号 (,)。这种转换支持更传统的语法来表示 Microsoft Windows 编程中的组合键,例如“Ctrl+Alt”。".
    【解决方案2】:
    <KeyBinding Command="{Binding SaveCommand}"
                Gesture="Ctrl+Shift+S" />
    

    请参阅 MSDN 文档,KeyBinding Class

    【讨论】:

      【解决方案3】:

      我知道问题是针对 XAML,但如果您想在代码中执行此操作,这里有一个示例(可以通过逻辑 OR 指定多个 ModifierKey):

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

      【讨论】:

        【解决方案4】:

        这里是my code实现多字符快捷键,如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 CmdAddNewAgreemnt。

        AddDoubleLetterShortCut 和 AddSingleLetterShortCut 都被重载以接受 Action 或 ICommand。

        这是我第一次尝试泛化一些东西,所以你可以接受这个想法并让它适合你。

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-05-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多