如何在“所有子项”控件处理后在窗体级别中处理 Keydown 事件
本文关键字:处理 窗体 事件 Keydown 控件 所有子项 | 更新日期: 2023-09-27 18:30:48
>我有一个包含两个控件 A 和 B 的表单,A 有一个按键事件,当在 A 控件上按"S"时,我会显示一个消息框。我想在任何其他控件中按下"S"时显示另一条消息。
我该怎么做?
我想要的是:我应该能够在所有子控件之后处理 Key-down 事件。并且我应该能够知道事件是否在窗体级按键的子控件中处理。
我尝试启用密钥预览,但是当启用密钥预览时,表单级事件会在子控件事件之前触发。我首先想要子控件,然后是窗体级别 1
我希望在触发焦点控件的键关闭事件后触发窗体级别事件。我想在表单级事件中检查该事件是否在重点控件键下事件中处理。
我可以使用什么方法?
请开导我。
你可以执行以下操作
下面是一个示例代码
- 添加新项目,将其称为事件示例
- 添加用户控件,将其称为 AControl
- 添加用户控件,将其称为基本控件
- 将 A-ontrol 背景色设为蓝色和 BControl 红色,以便与形式区分开来
表单 1 代码
namespace EventSample
{
public delegate void AfterChildEventHandler(Control control,Keys key);
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
aControl1.OnChildFireEvent += OnChildFireEvent;
bControl1.OnChildFireEvent += OnChildFireEvent;
}
void OnChildFireEvent(Control control, Keys key)
{
MessageBox.Show("Form fired event from " + control.GetType().Name);
}
}
}
代码
namespace EventSample
{
public partial class AControl : UserControl
{
public event AfterChildEventHandler OnChildFireEvent;
public AControl()
{
InitializeComponent();
}
private void AControl_KeyDown(object sender, KeyEventArgs e)
{
MessageBox.Show("A Control fired Key down");
if (OnChildFireEvent != null)
OnChildFireEvent(this, e.KeyCode);
}
}
}
BControl code
public partial class BControl : UserControl
{
public event AfterChildEventHandler OnChildFireEvent;
public BControl()
{
InitializeComponent();
}
private void BControl_KeyDown(object sender, KeyEventArgs e)
{
MessageBox.Show("B Control fired Key down");
if (OnChildFireEvent != null)
OnChildFireEvent(this, e.KeyCode);
}
}
编辑
另一种可以用更少的代码实现的解决方案
- 定义静态事件
- 在窗体中处理此事件
让每个控件调用此事件
命名空间事件示例{
public delegate void AfterChildEventHandler(Control control, Keys key); public class GlobalEvent { public static event AfterChildEventHandler OnChildEventFire; public static void Invoke(Control control, Keys key) { if (OnChildEventFire != null) OnChildEventFire(control, key); } }
}
A 控件中的更改
namespace EventSample
{
public partial class AControl : UserControl
{
public AControl()
{
InitializeComponent();
}
private void AControl_KeyDown(object sender, KeyEventArgs e)
{
MessageBox.Show("A Control fired Key down");
GlobalEvent.Invoke(this, e.KeyCode);
}
}
}
B 控件中的更改
namespace EventSample
{
public partial class BControl : UserControl
{
public BControl()
{
InitializeComponent();
}
private void BControl_KeyDown(object sender, KeyEventArgs e)
{
MessageBox.Show("B Control fired Key down");
GlobalEvent.Invoke(this, e.KeyCode);
}
}
}
构建示例并运行并尝试按 A 或 B 上的任意键,然后您会发现 A 将触发然后表单
希望对您有所帮助