代码之家  ›  专栏  ›  技术社区  ›  Anthony Brien

如何从WPF中的用户读取自定义键盘快捷方式?

  •  11
  • Anthony Brien  · 技术社区  · 15 年前

    在我的应用程序中,我想让用户自定义键盘快捷方式,就像在Visual Studio的键盘选项中一样。用户可以聚焦一个空白文本框,然后键入要分配给命令的任何快捷方式。

    我最接近的方法是订阅text box.previewkeydown事件,将其设置为已处理,以防止在文本框中实际输入文本。然后忽略与修改键相关联的keydown事件(是否有更清晰的方法来确定键是否是修改键?).

    // Code-behind
    private void ShortcutTextBox_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        // The text box grabs all input
        e.Handled = true;
    
        if (e.Key == Key.LeftCtrl || 
            e.Key == Key.RightCtrl || 
            e.Key == Key.LeftAlt ||
            e.Key == Key.RightAlt || 
            e.Key == Key.LeftShift ||
            e.Key == Key.RightShift)
            return;
    
        string shortcutText = "";
        if ((Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control)
            shortcutText += "Ctrl+";
        if ((Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift)
            shortcutText += "Shift+";
        if ((Keyboard.Modifiers & ModifierKeys.Alt) == ModifierKeys.Alt)
            shortcutText += "Alt+";
        _ShortcutTextBox.Text = shortcutText + e.Key.ToString();
    
    }
    

    以上方法适用于以ctrl和ctrl+shift开头的任何快捷方式,但对于任何alt快捷方式都失败。E.键始终设置为 Key.System 当我按下包含alt的快捷方式时。

    如何从用户记录alt快捷方式?有没有更好、更可靠的方法来记录用户的快捷方式?

    2 回复  |  直到 14 年前
        1
  •  23
  •   Frédéric Hamidi    14 年前

    诀窍是使用 SystemKey 属性如果 Key 属性设置为 Key.System :

    private void ShortcutTextBox_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        // The text box grabs all input.
        e.Handled = true;
    
        // Fetch the actual shortcut key.
        Key key = (e.Key == Key.System ? e.SystemKey : e.Key);
    
        // Ignore modifier keys.
        if (key == Key.LeftShift || key == Key.RightShift
            || key == Key.LeftCtrl || key == Key.RightCtrl
            || key == Key.LeftAlt || key == Key.RightAlt
            || key == Key.LWin || key == Key.RWin) {
            return;
        }
    
        // Build the shortcut key name.
        StringBuilder shortcutText = new StringBuilder();
        if ((Keyboard.Modifiers & ModifierKeys.Control) != 0) {
            shortcutText.Append("Ctrl+");
        }
        if ((Keyboard.Modifiers & ModifierKeys.Shift) != 0) {
            shortcutText.Append("Shift+");
        }
        if ((Keyboard.Modifiers & ModifierKeys.Alt) != 0) {
            shortcutText.Append("Alt+");
        }
        shortcutText.Append(key.ToString());
    
        // Update the text box.
        _ShortcutTextBox.Text = shortcutText.ToString();
    }
    

    我加了左右 Windows 修改器列表的键,因为它们有时出现在快捷键名称中( Ctrl+Shift+Alt )密钥组合是从终端服务器会话键入的。他们从来没有出现过 Keyboard.Modifiers 但是,因为它们是为全局快捷方式保留的,所以我不在那里处理它们。

    我也用过 StringBuilder 避免造成太多 string 实例。

    此解决方案适用于任何键组合,除了 Shift+Alt (the Alt 在这种情况下看不到修饰符)。不过,这可能是我的终端服务器环境的产物,所以您的里程数可能会有所不同。

    最后,我添加了一个 _File 窗口的菜单以查看会发生什么,以及 Alt+F 快捷键在到达菜单之前被文本框有效地捕获,这似乎是您想要的。

        2
  •  -1
  •   Rev    14 年前

    您好!
    如果 You used WPF-Command 在您的应用程序中,您可以使用:

    <Window.InputBindings>
      <KeyBinding Command="YourCommnad"
                  Gesture="CTRL+C" />
    </Window.InputBindings>