簡體   English   中英

UserControl KeyDown事件不能防止Windows應用程序KeyDown事件的撤消

[英]UserControl KeyDown Event Not Fire Against Revoke Of Windows Application KeyDown Event

我有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);

}

當用戶控件添加到Windows窗體時,這將顯示用戶控件,如下所示:

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

    }

我想針對用戶控件的可見性撤消winform的keydown事件,並觸發UserControl的keydown事件以隱藏UserControl,但效果不佳。 UserControl事件的keydown事件不會觸發。 不知道為什么嗎? 如何以正確的方式做同樣的事情?

鍵盤通知會以焦點發布到控件。 幾乎從來都不是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鍵不是最好的主意,放置在用戶控件上的Form很有可能需要該鍵。 就像一個對話框。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM