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将不再移动光标),没关系,这就是我想要的。
您可以做的是注册到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)
| 归档时间: |
|
| 查看次数: |
1239 次 |
| 最近记录: |