处理窗体上的所有控件的点击
我有一个.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 }); }
这现在得到支持事件的控件的点击,但是例如,标签仍然没有得到任何东西。 有没有简单的方法来做到这一点,我俯瞰?
如果标签是在一个子控件,那么你必须recursion地做到这一点:
void initControlsRecursive(ControlCollection coll) { foreach (Control c in coll) { c.MouseClick += (sender, e) => {/* handle the click here */}); initControlsRecursive(c.Controls); } } /* ... */ initControlsRecursive(Form.Controls);
要处理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."); } }