我正在尝试监听在 C# 应用程序上按下的箭头键。
我在 XAML 文件的 C# 文件中添加了以下方法来侦听按下的箭头键并报告每个箭头键:
private void Grid_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Left)
{
Console.WriteLine("left");
}
if (e.Key == Key.Right)
{
Console.WriteLine("Right");
}
if (e.Key == Key.Up)
{
Console.WriteLine("Up");
}
if (e.Key == Key.Down)
{
Console.WriteLine("Down");
}
}
Run Code Online (Sandbox Code Playgroud)
在相应的 XAML 中,Grid 元素的开头如下:
<Grid Background="Black" MouseWheel="Grid_MouseWheel"
MouseDown="Grid_MouseDown" MouseUp="Grid_MouseUp"
MouseMove="Grid_MouseMove" KeyDown="Grid_KeyDown">
Run Code Online (Sandbox Code Playgroud)
目前,鼠标相关的监听器正在运行,但键盘监听器 (KeyDown="Grid_KeyDown") 没有运行。我是否需要添加其他东西才能使这项工作?
永远不会调用您的处理程序的原因是因为 Grid 本身处理 KeyDown 事件,并设置标志以阻止事件进一步冒泡(到您的应用程序处理程序)。你可以做的是处理PreviewKeyDown
事件。这使您有机会在 Grid 之前响应按键按下事件。
在 XAML 文件中,像这样修改您的 Grid 元素:
<Grid Background="Black" MouseWheel="Grid_MouseWheel"
MouseDown="Grid_MouseDown" MouseUp="Grid_MouseUp"
MouseMove="Grid_MouseMove" PreviewKeyDown="Grid_PreviewKeyDown">
Run Code Online (Sandbox Code Playgroud)
事件处理程序的实际代码几乎相同:
private void Grid_PreviewKeyDown(object sender, KeyEventArgs e)
{
if(e.Key == Key.Left)
Console.WriteLine("left");
// and whatever else you want to do here..
}
Run Code Online (Sandbox Code Playgroud)
注意确保网格是逻辑焦点范围的一部分也很重要。如果没有,并且某些其他元素在不同的树中具有键盘焦点,则 Grid 将不会接收任何事件。有关详细信息,请参见此处:http : //msdn.microsoft.com/en-us/library/aa969768(v=vs.110).aspx