簡體   English   中英

如何在所有子控件處理后處理表單級別的 Keydown 事件?

[英]How to handle Keydown event in Form level after All Child controls handled it?

我有一個帶有兩個控件 A 和 B 的表單,A 有一個按鍵按下事件,當在 A 控件上按下“S”時我會顯示一個消息框。 我想在任何其他控件中按下“S”時顯示另一條消息。

我怎樣才能做到這一點 ?

我想要的是:我應該能夠在所有子控件之后處理 Key-down 事件。 並且我應該能夠知道該事件是否在 Form-level Key-down 的子控件中處理。

我嘗試啟用鍵預覽,但是當啟用鍵預覽時,表單級事件會在子控件事件之前觸發。 我首先想要子控件,然后形成一級

我希望在觸發焦點控件的按下鍵事件后觸發表單級事件。 並且我想檢查表單級事件是否在焦點控件按鍵事件中處理該事件。

我可以使用哪些方法?

請賜教。

您可以執行以下操作

這里是一個示例代碼

  1. 添加新項目,稱之為 EventSample
  2. 添加一個 UserControl 稱之為 AControl
  3. 添加一個 UserControl 稱之為 BControl
  4. 使 AControl BackColor Blue 和 BControl Red 以區別於表單

//表單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);
        }
    }
}

//A控制代碼

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);
        }
    }
}

//B控制代碼

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. 讓每個控件調用這個事件

    命名空間 EventSample {

     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 將觸發然后表單

希望它會幫助你

暫無
暫無

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

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