2008-10-29 7 views
9

Mam .NET UserControl (FFX 3.5). Ta kontrolka zawiera kilka formantów podrzędnych - panel, parę etykiet, kilka pól tekstowych i jeszcze jedną niestandardową kontrolę. Chcę obsłużyć kliknięcie prawym przyciskiem myszy w dowolnym miejscu na sterowniku podstawowym - tak, aby kliknąć prawym przyciskiem myszy na dowolną kontrolę nad dzieckiem (lub dziecko dziecka w przypadku panelu). Chciałbym to zrobić tak, aby było możliwe do utrzymania, jeśli ktoś wprowadzi zmiany w sterowaniu bez konieczności podłączania do obsługi nowych kontrolek, na przykład.Obsługa a Kliknij wszystkie formanty w formularzu

Najpierw próbowałem przesłonić WndProc, ale jak podejrzewałem, otrzymuję wiadomości tylko dla kliknięć bezpośrednio na formularzu, a nie jego dzieci. Jako pół-Hack, dodałem następujące po InitializeComponent:

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

to teraz dostaje kliknięć dla kontroli obsługujących wydarzenie, ale etykiety, na przykład, nadal nie dostaniesz nic. Czy istnieje prosty sposób, aby to zrobić, że przeoczyłem?

Odpowiedz

15

Jeśli etykiety są w subcontrol wtedy trzeba by to zrobić rekurencyjnie:

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

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

Tak cholernie oczywiste, że nie mogłem zobaczyć lasu dla drzew. Dzięki. – ctacke

0

obsłużyć MouseClick wydarzenie dla prawego kliknięcia na wszystkich kontroli w zwyczaju UserControl:

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."); 
    } 
} 
Powiązane problemy