如何在“所有子项”控件处理后在窗体级别中处理 Keydown 事件

本文关键字:处理 窗体 事件 Keydown 控件 所有子项 | 更新日期: 2023-09-27 18:30:48

>我有一个包含两个控件 A 和 B 的表单,A 有一个按键事件,当在 A 控件上按"S"时,我会显示一个消息框。我想在任何其他控件中按下"S"时显示另一条消息。

我该怎么做?

想要的是:我应该能够在所有子控件之后处理 Key-down 事件。并且我应该能够知道事件是否在窗体级按键的子控件中处理。

我尝试启用密钥预览,

但是当启用密钥预览时,表单级事件会在子控件事件之前触发。我首先想要子控件,然后是窗体级别 1

我希望在触发

焦点控件的键关闭事件后触发窗体级别事件。我想在表单级事件中检查该事件是否在重点控件键下事件中处理。

我可以使用什么方法?

请开导我。

如何在“所有子项”控件处理后在窗体级别中处理 Keydown 事件

你可以执行以下操作

下面是一个示例代码

  1. 添加新项目,将其称为事件示例
  2. 添加用户控件,将其称为 AControl
  3. 添加用户控件,将其称为基本控件
  4. 将 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);
        }
    }

编辑

另一种可以用更少的代码实现的解决方案

  1. 定义静态事件
  2. 在窗体中处理此事件
  3. 让每个控件调用此事件

    命名空间事件示例{

    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 将触发然后表单

希望对您有所帮助