C# 窗体:引发鼠标事件(从子级传递到父级)

C# Forms: Raise mouse event (pass from child to parent)

正在寻找任何解决方案。 我有一个带有多个文本框的用户控件。当放置在窗体上时,只有在用户控件主体上单击时才会触发 MouseDown 和 MouseMove 事件,但在文本框中单击时不会触发。 当文本框 mousedown 事件发生时,是否可以引发用户控件的 mousedown 事件? 或者是否可以将事件从对象传递给它的父对象? (仍然可以点击文本框进行编辑?)

谢谢

在这个例子中,我处理了 TextBoxes MouseDown 事件。从这里,您可以引发持有 TextBox.

的 UserControl 的 MouseDown 事件
public partial class UserControl1 : UserControl
{
    public UserControl1()
    {
        InitializeComponent();
    }

    private void textBox1_MouseDown(object sender, MouseEventArgs e)
    {
        OnMouseDown(e); // Goes through as a MouseDown Event from UserControl1
    }
}

根据您的要求,这可能对您不起作用,因为当处理 UserControl 的 MouseDown 时,它将通过 UserControl 发起(发件人参数将参考UserControl1.

我也提取了Controlclass的OnMouseDown实现,看看能不能用:

        // Extracted using Reflection
        // This will not compile as Control.EventMouseDown is a private member
        System.Windows.Forms.MouseEventHandler mouseEventHandler = (System.Windows.Forms.MouseEventHandler)this.Events[System.Windows.Forms.Control.EventMouseDown];
        if (mouseEventHandler == null)
            return;
        mouseEventHandler(sender, e);

不幸的是,事件存储在私有成员中,不易访问。

如果您想了解和处理源自文本框的 MouseDown 事件,则必须声明并引发自定义事件。

声明自定义事件

public event EventHandler<MouseEventArgs> TextBoxMouseDownEvent;

从 TextBox_MouseDown

引发自定义事件
private void textBox1_MouseDown(object sender, MouseEventArgs e)
{
    EventHandler<MouseEventArgs> handler = TextBoxMouseDownEvent;
    if (handler != null)
    {
        handler(sender, e);
    }
}