2008-10-29 19 views
9

Bir .NET UserControl (FFX 3.5) sahibim. Bu denetim birkaç çocuk Denetimleri içerir - bir Panel, bir çift Etiketler, bir çift TextBoxes ve yine başka bir özel Denetim. Temel Kontrol'ün herhangi bir yerinde bir sağ tıklamayı kullanmak istiyorum - böylece herhangi bir çocuk kontrolüne (veya Panelde bir çocuğun çocuğuna) sağ tıklamak. Bunu yapmak isterim ki, örneğin birileri Kontroller üzerinde yeni Kontroller için işleyicilere tel çekmeye gerek kalmadan değişiklikler yaparsa, bu bakımın sürdürülebilmesini sağlar.Bir Formdaki tüm denetimler için bir tıklama ile çalışma

İlk olarak, WndProc'u geçersiz kılmayı denedim, ancak şüphelendiğim gibi, yalnızca formdaki tıklamalar için yalnızca çocuklardan hiçbirine ileti almam.

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

Bu şimdi olay destekleyen kontroller, ancak Etiketleri için tıklama alır, örneğin, hala bir şey alamadım: yarı hack olarak, InitializeComponent sonra aşağıdaki ekledi. Bunu yaptığım için bunu yapmanın basit bir yolu var mı? etiketler subcontrol iseniz

cevap

15

sonra yinelemeli bunu yapmak zorundayız:

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

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

Ağaçlar için ormanı göremediğim açıktı. Teşekkürler. – ctacke

0

özel bir UserControl tüm denetimlere sağ tıklama için bir MouseClick olayı işlemek için:

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."); 
    } 
} 
İlgili konular