用C#/WPF听笔画

本文关键字:笔画 WPF | 更新日期: 2023-09-27 18:26:34

我正在尝试监听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")没有运行。我需要添加其他内容吗?

用C#/WPF听笔画

处理程序从未被调用的原因是因为Grid本身处理KeyDown事件,并设置标志以阻止事件进一步冒泡(到应用程序处理程序)。您可以做的是处理PreviewKeyDown事件。这使您有机会在网格之前响应按键按下事件。

在XAML文件中,修改网格元素如下:

<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..
}

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

您需要将网格的Focusable属性设置为"true";因为它的"false";默认情况下。

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

此外,如果你在初始化后关注网格,你不必每次启动应用程序时都点击窗口:

public MainWindow()
    {
        InitializeComponent();
        GridWindow.Focus();           
    }

我将网格命名为"GridWindow";。