【问题标题】:How can I override default "global" keyboard shortcuts and create my own instead?如何覆盖默认的“全局”键盘快捷键并创建自己的?
【发布时间】:2014-04-07 17:28:24
【问题描述】:

我了解 WPF 中的基本事件路由/冒泡(但显然还不够)...我想要做的是在我的 WPF 桌面应用程序中使用基本的键盘快捷键。例如,我有一个 ListBox,当用户按下 Page-UpPage-Down (任何东西都可以在应用程序中聚焦)时,我希望列表框如果适用,请选择其上一项或下一项。

这是我目前所拥有的,但它不起作用。这是一个名为“Main”的窗口的构造函数:

public Main()
{
    InitializeComponent();

    // Initialize keyboard shortcuts
    KeyDown += (s, e) =>
    {
        var viewModel = GetActiveViewModel();
        if (e.Key == Key.PageUp)
        {
            viewModel.SelectPreviousItem();
            e.Handled = true;
        }
        else if (e.Key == Key.PageDown)
        {
            viewModel.SelectNextItem();
            e.Handled = true;
        }
    };
}

与此代码不同的是,活动控件正在“窃取”事件并实现默认行为,例如如果我选择了一个文本框,则文本框正在移动光标,如果我选择了列表框,则列表框会将所选索引移动一个“页面”,而不是像我想要的那样移动单个项目。

如何指示 WPF “忽略”任何默认键盘挂钩并用我自己的逻辑替换它们?我了解我将“覆盖”某些控件的默认行为(例如,文本框中的 Page-Up/Page-Down 将不再移动光标),没关系,这就是我想要的。

【问题讨论】:

  • 永远记住最小意外的原则。如果我在应用程序中按下“向上翻页”按钮,它向上移动一项,我会感到困惑和恼火。我按上一页是因为我想上一页。
  • 这些不是我的要求,它们是业务应用程序的要求。我了解用户体验原则,但我需要实现这一点。如果它让你感觉更好,假装快捷方式将是Ctrl+PageUp。 ;)

标签: c# .net wpf keyboard-shortcuts


【解决方案1】:

您可以做的是注册到 PreviewKeyDown 事件。

在 WPF 中发生的事情是,每个控件都可以有一个事件的默认实现,然后将“Handled”属性设置为 true,这会告诉 WPF 中的可视化树停止传播事件。

试试这个:

PreviewKeyDown += (s, e) =>
{
   var viewModel = GetActiveViewModel();
   if (e.Key == Key.PageUp)
   {
      viewModel.SelectPreviousItem();
      e.Handled = true;
   }
   else if (e.Key == Key.PageDown)
   {
      viewModel.SelectNextItem();
      e.Handled = true;
   }
};

【讨论】:

    【解决方案2】:

    这不会完全奏效。

    您需要在here列表中找到操作系统注册的全局热键:

    使用 KEYBOARD_LL 挂钩 Win32 操作系统代码

    SetWindowsHookEx((int) HookType.WH_KEYBOARD_LL, _keyboardProc, moduleHandler, 0);

    我为一家公司做这件事,我包装了 WPF CommandBindings -> WF -> Win32 LL。

    一些最大的选项,例如 Ctl+Alt+Del,您可以从注册表中取出并删除屏幕上的所有选项,例如注销、任务管理器等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-04
      • 1970-01-01
      • 1970-01-01
      • 2011-10-25
      • 2015-04-17
      • 2022-12-09
      • 2011-04-10
      • 1970-01-01
      相关资源
      最近更新 更多