如何覆盖默认的“全局”键盘快捷键并创建我自己的快捷键?

qJa*_*ake 3 .net c# wpf keyboard-shortcuts

我了解 WPF 中的基本事件路由/冒泡(虽然显然还不够)……我想要做的是在我的 WPF 桌面应用程序中使用基本的键盘快捷键。例如,我有一个 ListBox,当用户按下Page-Up或 时Page-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;
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

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

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

Yuv*_*kov 5

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

WPF 中发生的事情是每个控件都可以有一个事件的默认实现,然后将“处理”属性设置为 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;
   }
};
Run Code Online (Sandbox Code Playgroud)