2013-02-25 48 views
3

我有一個UserControl其中包含一些內部控件。是這樣的:我如何使內部控制不包括主要控件的事件?

enter image description here

現在,當我在我的項目中使用它,我想每一個我的控制提出同樣的單擊事件,如果點擊,就像其他控件。

但問題是:我的處理程序在另一個項目,處理點擊事件,當我點擊背景上的某處,而不是button1或label1。

我可以解決它通過設置內部控件的每個事件引發主控制另一個事件,但它有點奇怪。

如何讓內部控件不覆蓋主控件的事件?

+0

它有點奇怪,你會怎麼觸發按鈕點擊?爲什麼你需要一個按鈕? – 2013-02-25 21:39:58

+0

@NikolaDavidovic那麼,你可以有一個處理程序在整個UC內進行任何點擊操作,而另一個處理程序在點擊按鈕時運行。每個事件可以有多個處理程序,所以沒有什麼可以阻止它。 – Servy 2013-02-25 21:46:27

+0

@Servy True,但我期待OP的回答,這樣他就可以澄清問題,我們可以提供更好的答案。 – 2013-02-25 21:51:58

回答

2

我建議借力UserControl的Load事件遍歷所有子控件在您的項目和程序添加一個處理每一個的mouseMoved事件。這將足夠強大以處理添加的任何新的子控件。例如;

private void UserControl1_Load(object sender, EventArgs e) 
    { 
     foreach (Control c in Controls) 
     { 
      c.MouseMove += Control_Move; 
     } 
    } 

    protected void Control_Move(object sender, MouseEventArgs e) 
    { 
     // do stuff here 
    } 

而且不要忘了你的用戶控件的MouseMove事件掛接到同一Control_Move方法

+0

只有每個孩子的控制都一樣,他們纔不會這樣做。 – Servy 2013-02-25 21:41:59

+0

@Servy true ...我能想到的唯一方法就是深入研究Win32 API並添加消息鉤子。如果.NET沒有公開必要的事件,那麼除了有效地創建自己的 – DiskJunky 2013-02-25 21:45:21

+0

@DiskJunky謝謝,所以我應該添加每個事件,即MouseMove,MouseClick,Load, , 這條路? – Blazi 2013-02-25 22:03:52

2

我做了這樣的事情在Delphi中。訣竅是不添加標籤,而是添加標籤,按鈕等的子類,以調用事件上的父母事件。

子類只是覆蓋Click,Move等並調用父類。簡單,如果你有很多這樣的話,可以節省很多時間。

+0

您能否介紹一下如何重寫一個事件? – Blazi 2013-02-26 07:27:23

+0

class ParentUserControl:UserControl {0} {0} public override void OnMouseDown } } //你的新控件源於此............ \t類ParentClickButton:按鈕 \t { 保護覆蓋無效onmousedown事件(MouseEventArgs mevent) { ((ParentUserControl)this.Parent).OnMouseDown(mevent); base.OnMouseDown(mevent); } \t} //你新的控制增加了這些,而不是按鈕... – CharlesW 2013-02-26 15:52:20

+0

另外,看看這個帖子的另一種方法,我以前用過:http://stackoverflow.com/questions/547172/pass-through- mouse-events-to-parent-control – CharlesW 2013-02-26 15:52:40