2008-10-29 55 views
9

我有一個.NET UserControl(FFX 3.5)。此控件包含多個子控件 - 一個面板,一對標籤,一對文本框以及另一個自定義控件。我想在基本控件的任何地方處理右鍵單擊 - 所以右鍵單擊任何子控件(或面板情況下的子控件的子控件)。我希望這樣做,以便可以維護,例如,如果有人對控件進行了更改,而無需爲處理新控件而聯絡處理程序。處理表單上的所有控件

首先我嘗試覆蓋WndProc,但正如我懷疑的那樣,我只直接在窗體上獲取消息,而不是其任何子項。作爲一個半劈,我添加的InitializeComponent後執行以下操作:

foreach (Control c in this.Controls) 
    { 
    c.MouseClick += new MouseEventHandler(
     delegate(object sender, MouseEventArgs e) 
     { 
     // handle the click here 
     }); 
    } 

這現在得到了支持事件的控制,但標籤點擊,例如,仍然沒有得到任何東西。有沒有簡單的方法來做到這一點,我忽略了?

回答

15

如果標籤的子控件,那麼你不得不遞歸做到這一點:

void initControlsRecursive(ControlCollection coll) 
{ 
    foreach (Control c in coll) 
    { 
     c.MouseClick += (sender, e) => {/* handle the click here */}); 
     initControlsRecursive(c.Controls); 
    } 
} 

/* ... */ 
initControlsRecursive(Form.Controls); 
+0

所以很明顯,我看不到森林的樹木。謝謝。 – ctacke 2008-10-29 19:54:34

0

在自定義用戶控件處理一個鼠標點擊事件右鍵點擊所有的控件:

public class MyClass : UserControl 
{ 
    public MyClass() 
    { 
     InitializeComponent(); 

     MouseClick += ControlOnMouseClick; 
     if (HasChildren) 
      AddOnMouseClickHandlerRecursive(Controls); 
    } 

    private void AddOnMouseClickHandlerRecursive(IEnumerable controls) 
    { 
     foreach (Control control in controls) 
     { 
      control.MouseClick += ControlOnMouseClick; 

      if (control.HasChildren) 
       AddOnMouseClickHandlerRecursive(control.Controls); 
     } 
    } 

    private void ControlOnMouseClick(object sender, MouseEventArgs args) 
    { 
     if (args.Button != MouseButtons.Right) 
      return; 

     var contextMenu = new ContextMenu(new[] { new MenuItem("Copy", OnCopyClick) }); 
     contextMenu.Show((Control)sender, new Point(args.X, args.Y)); 
    } 

    private void OnCopyClick(object sender, EventArgs eventArgs) 
    { 
     MessageBox.Show("Copy menu item was clicked."); 
    } 
} 
相關問題