c# - 使用 C#/WPF 监听击键

标签 c# wpf xaml

我正在尝试监听在 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");
    }
}

在相应的 XAML 中,Grid 元素的开头如下:

<Grid Background="Black" MouseWheel="Grid_MouseWheel"
    MouseDown="Grid_MouseDown" MouseUp="Grid_MouseUp"
    MouseMove="Grid_MouseMove" KeyDown="Grid_KeyDown">

目前,与鼠标相关的监听器正在运行,但与键盘相关的监听器 (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">

事件处理程序的实际代码几乎相同:

private void Grid_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if(e.Key == Key.Left)
       Console.WriteLine("left");
    //  and whatever else you want to do here..
}

注意 确保网格是逻辑焦点范围的一部分也很重要。如果不是,并且某些其他元素在不同的树中具有键盘焦点,则 Grid 将不会接收任何事件。详情请看这里:http://msdn.microsoft.com/en-us/library/aa969768(v=vs.110).aspx

关于c# - 使用 C#/WPF 监听击键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26369580/

相关文章:

c# - timeBeginPeriod 不适用于 Intel Comet Lake CPU (i5 10400H)

c# - CSLA getproperty、setproperty和一般getters和setters的区别

c# - 如何在 ms word 模板中放置标签并用数据库中的数据填充它们

c# - 在 WPF 应用程序中显示网页的某些部分的方法

wpf - 修改 TabControl 的标题

c# - 在 C# 中保存字典 <String, Int32> - 序列化?

c# - 使用 MVVM 构建选项列表

c# - 透明背景png重叠路径

.net - XC1020 : Build error occurred in the XAML MSBuild task in WWF4. 0 控制台应用程序

c# - 在先前在应用程序资源中定义的新窗口中覆盖边框样式(可能是错误?)