如何为表单设置单击事件?

Myk*_*oft 6 c# winforms

我有一个ac#form(让我们称之为MainForm),上面有许多自定义控件.我想在任何人点击表单的时候触发MainForm.OnClick()方法,无论表单上是否发生了点击,或者点击是否在其中一个自定义控件上.我正在寻找类似于表单的KeyPreview功能的行为,除了鼠标点击而不是按键.

Ché*_*Don 6

我建议为应用程序中的其他表单创建一个基本表单以继承.将此代码添加到基本表单以创建名为GlobalMouseClickEventHandler的新事件:

namespace Temp
{
    public delegate void GlobalMouseClickEventHander(object sender, MouseEventArgs e);

    public partial class TestForm : Form
    {
        [Category("Action")]
        [Description("Fires when any control on the form is clicked.")]
        public event GlobalMouseClickEventHander GlobalMouseClick;

        public TestForm()
        {
            InitializeComponent();
            BindControlMouseClicks(this);
        }

        private void BindControlMouseClicks(Control con)
        {
            con.MouseClick += delegate(object sender, MouseEventArgs e)
            {
                TriggerMouseClicked(sender, e);
            };
            // bind to controls already added
            foreach (Control i in con.Controls)
            {
                BindControlMouseClicks(i);
            }
            // bind to controls added in the future
            con.ControlAdded += delegate(object sender, ControlEventArgs e)
            {
                BindControlMouseClicks(e.Control);
            };            
        }

        private void TriggerMouseClicked(object sender, MouseEventArgs e)
        {
            if (GlobalMouseClick != null)
            {
                GlobalMouseClick(sender, e);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

此解决方案不仅适用于顶级控件,还适用于嵌套控件,例如放置在面板内的控件.


小智 3

在窗体的 ControlAdded 事件中,将 MouseClick 处理程序添加到控件,并使用窗体单击事件的地址。我还没有测试过这个,但它可能有效。

Private Sub Example_ControlAdded(ByVal sender As Object, ByVal e As System.Windows.Forms.ControlEventArgs) Handles Me.ControlAdded

    AddHandler e.Control.MouseClick, AddressOf Example_MouseClick
End Sub

Private Sub Example_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick
    MessageBox.Show("Click")
End Sub
Run Code Online (Sandbox Code Playgroud)