UserControl KeyDown 事件不会触发撤销 Windows 应用程序 KeyDown 事件
Posted
技术标签:
【中文标题】UserControl KeyDown 事件不会触发撤销 Windows 应用程序 KeyDown 事件【英文标题】:UserControl KeyDown Event Not Fire Against Revoke Of Windows Application KeyDown Event 【发布时间】:2012-10-29 19:04:02 【问题描述】:我有 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);
我想针对 UserControl 的可见性撤销 winform 的 keydown 事件,并触发 UserControl 的 keydown 事件以隐藏 UserControl,但效果不佳。 UserControl 事件的 keydown 事件不会触发。不知道为什么?。如何以正确的方式做同样的事情?
【问题讨论】:
请在问题中添加 windows 标签,以便吸引合适的人。 【参考方案1】:键盘通知发布到具有焦点的控件。这几乎从来不是一个用户控件,它不想要焦点。即使您使用 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 键并不是最好的主意,您放置用户控件的表单很可能需要该键。像一个对话框。
【讨论】:
你的想法是可行的,但它阻止了 button1_Click EventHandler 以供进一步使用。 不知道这意味着什么。请注意您发布的代码中的错误,它不会取消订阅正确的事件处理程序。在订阅它的代码中出现这个错误很容易解释你的新问题。以上是关于UserControl KeyDown 事件不会触发撤销 Windows 应用程序 KeyDown 事件的主要内容,如果未能解决你的问题,请参考以下文章
为啥 UserControl 的 Unloaded 事件不会触发?