gpt4 book ai didi

c# - UserControl KeyDown 事件不会针对撤销 Windows 应用程序 KeyDown 事件而触发

转载 作者:可可西里 更新时间:2023-11-01 10:53:43 28 4
gpt4 key购买 nike

我有 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 对 UserControl 可见的 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 键并不是最好的主意,您放置用户控件的表单可能需要该键。就像对话一样。

关于c# - UserControl KeyDown 事件不会针对撤销 Windows 应用程序 KeyDown 事件而触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13308438/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com