UserControl KeyDown事件未触发Windows应用程序KeyDown事件的撤销

时间:2012-11-09 12:53:17

标签: c# windows visual-studio user-controls

我有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而导致事件无法触发,如下所示:

Windows窗体:

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

}

这将显示UserControls,因为UserControls被添加到Windows窗体中,如下所示:

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

    }

我想撤销winform的keydown事件以防止UserControl的可见事件并触发UserControl的keydown事件以隐藏UserControl,但它不能很好。 UserControl事件的keydown事件不是火。不知道为什么?如何以正确的方式做同样的事情?。

1 个答案:

答案 0 :(得分:10)

键盘通知以焦点发布到控件。这几乎从来不是UserControl,它不想要焦点。即使您使用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键不是最好的主意,您将用户控制的表单可能需要该密钥。就像一个对话框。