欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

.NET漫游指南-010-WPF中的KeyDown和PreviewKeyDown事件的区别和用法

程序员文章站 2022-06-08 23:11:54
...

参考网址:https://msdn.microsoft.com/zh-cn/library/system.windows.forms.control.keydown(v=vs.110).aspx

关于Control.KeyDown事件官方的备注中是这样说明的(建议直接看英文,中文文档翻译不准确,

如果只是想要处理窗口级别的键盘事件同时也不想其它控件接收到键盘事件,在你的窗体中控件的KeyPress事件处理方法中将KeyPressEventArgs.Handled属性

设置为True(也就是添加一句e.handle = true;)。

某些按键,像TAB,RETRUN,ESC和方向键会被控件自动处理,也就是说这些按键的事件并不会被KeyPress事件处理方法捕获
。为了使这些按键能够激发KeyDown事件,我们必须在窗体中的每个控件中重写IsInputKey方法。在IsInputKey重写的代码中需要去判定是否有特殊按键被按下,如果有则返回一个True值。

上面的方法太过繁琐,其中一个替代的方式是我们可以处理PreviewKeyDown事件设置IsInputKey属性为true。

代码如下:(从官方文档中摘录)

// By default, KeyDown does not fire for the ARROW keys
void button1_KeyDown(object sender, KeyEventArgs e)
{
    switch (e.KeyCode)
    {
        case Keys.Down:
        case Keys.Up:
            if (button1.ContextMenuStrip != null)
            {
                button1.ContextMenuStrip.Show(button1,
                    new Point(0, button1.Height), ToolStripDropDownDirection.BelowRight);
            }
            break;
    }
}

// PreviewKeyDown is where you preview the key.
// Do not put any logic here, instead use the
// KeyDown event after setting IsInputKey to true.
private void button1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
    switch (e.KeyCode)
    {
        case Keys.Down:
        case Keys.Up:
            e.IsInputKey = true;
            break;
    }
}

关于PreviewKeyDown事件,官方解释是

Occurs before the KeyDown event when a key is pressed while focus is on this control.

发生在keyDown事件之前。

除此之外:一些按键例如:tab,return,esc和方向键的按下操作一般都会被控件忽略,因为这些按键并不被认为是输入按键。举例来说,默认情况下一个按键会忽略方向键。触发方向键一般会使焦点从上一个控件,移动到下一个控件。方向键一般被认为是导航键,触发方向键一般也不会激发控件的KeyDown事件,但是,触发一个控件的方向键会激发previewKeyDown事件。通过在perviewKeyDown事件中将控件的isInputKey属性设为true,我们就可以在按下方向键时激发keyDown事件。然而,如果我们按这种方式处理了方向键,焦点也不会像之前那样从上一个控件移动到下一个控件上去了。

想要深入了解可以去MSDN上参考Handling and Raising Events方面的文档。



  • Add to Phrasebook
    • No wordlists for English -> Simplified Chinese...
    • Create a new wordlist...
  • Copy