1

我有 UserControl 并面临 KeyDown 事件的问题。我的 UserControls 将显示反对撤销 windows 窗体 keydown 事件,如下所示:

用户控件的事件:

private void UserControl_KeyDown(object sender,KeyEventArgs e)
{
        if ((Keys)e.KeyCode == Keys.Escape) 
        {
            this.Visible = false;

        }

}

上述事件将不得不隐藏 UserControl,但由于撤销 windows 窗体 keydown,事件不会触发,如下所示:

窗体:

private void button1_Click(object sender, EventArgs e)
{
        panel1.SendToBack();
        panel2.SendToBack();
        panel3.SendToBack();
        panel4.SendToBack();
        am.Focus();
        this.KeyDown -= new KeyEventHandler(Form1_KeyDown);

}

这将显示用户控件,因为用户控件被添加到 windows 窗体,如下所示:

    private UserControl.UserControl am = new UserControl.UserControl();
    public Form1()
    {
        InitializeComponent();
        this.Controls.Add(am);

    }

我想针对 UserControl 的可见性撤销 winform 的 keydown 事件并触发 UserControl 的 keydown 事件以隐藏 UserControl,但效果不佳。UserControl 事件的 keydown 事件不会触发。不知道为什么?。如何以正确的方式做同样的事情?

4

1 回答 1

13

键盘通知发布到具有焦点的控件。这几乎从来不是一个用户控件,它不想要焦点。即使您使用 Focus() 方法显式设置焦点,它也会立即将其传递给其子控件之一。UserControl 被设计为只是其他控件的容器。

改写 ProcessCmdKey() 方法。将此代码粘贴到控件类中:

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
        if (keyData == Keys.Escape) {
            this.Visible = false;
            return true;
        }
        return base.ProcessCmdKey(ref msg, keyData);
    }

请注意,使用 Escape 键并不是最好的主意,您放置用户控件的表单很可能需要该键。就像一个对话。

于 2012-11-09T13:21:55.680 回答