Обработка щелчка для всех элементов управления в форме - PullRequest
9 голосов
/ 29 октября 2008

У меня есть .NET UserControl (FFX 3.5). Этот элемент управления содержит несколько дочерних элементов управления - панель, пару меток, пару текстовых полей и еще один пользовательский элемент управления. Я хочу обработать щелчок правой кнопкой мыши в любом месте базового элемента управления - поэтому щелкните правой кнопкой мыши любой дочерний элемент управления (или дочерний элемент в случае Panel). Я хотел бы сделать это так, чтобы его можно было обслуживать, если кто-то вносит изменения в элемент управления, не подключая обработчики для новых элементов управления, например.

Сначала я попытался переопределить WndProc, но, как я и подозревал, я получаю сообщения только для кликов в Форме напрямую, а не для его дочерних элементов. В качестве полухака я добавил следующее после InitializeComponent:

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

Теперь он получает щелчки для элементов управления, которые поддерживают событие, но, к примеру, метки до сих пор ничего не получают. Есть ли простой способ сделать это, что я пропускаю?

Ответы [ 2 ]

17 голосов
/ 29 октября 2008

Если метки находятся в субконтроле, вам придется делать это рекурсивно:

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

/* ... */
initControlsRecursive(Form.Controls);
0 голосов
/ 14 июля 2016

Для обработки события MouseClick для щелчка правой кнопкой мыши по всем элементам управления в пользовательском 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.");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...