gpt4 book ai didi

c# - 如何覆盖默认的 "global"键盘快捷键并创建我自己的键盘快捷键?

转载 作者:行者123 更新时间:2023-11-30 16:12:29 25 4
gpt4 key购买 nike

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

最佳答案

您可以做的是注册到 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;
}
};

关于c# - 如何覆盖默认的 "global"键盘快捷键并创建我自己的键盘快捷键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22919174/

25 4 0
文章推荐: javascript - 圆 Angular