Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何重定向usercontrol上的事件_C#_.net_Winforms_User Controls - Fatal编程技术网

C# 如何重定向usercontrol上的事件

C# 如何重定向usercontrol上的事件,c#,.net,winforms,user-controls,C#,.net,Winforms,User Controls,我有一个用户控件,非常简单,只有一个标签和一个picturebox,它们是固定的,你甚至看不到底层 大多数事件从未发生(单击、悬停等) 我认为(我可能错了),这是因为事件不会被触发,因为它们被点击在标签或图片盒上,而不是在背景上 我需要以某种方式重定向这些事件(即在usercontrol中创建该事件,并以某种方式将它们重定向到我的代码,我的代码指的是使用它们的表单)或任何其他方式来捕获这些事件 我已经看到了5个关于同一问题的主题,没有一个得到解决,有任何解决方法吗?您需要使用以下代码将标签和图片

我有一个用户控件,非常简单,只有一个标签和一个picturebox,它们是固定的,你甚至看不到底层 大多数事件从未发生(单击、悬停等)

我认为(我可能错了),这是因为事件不会被触发,因为它们被点击在标签或图片盒上,而不是在背景上

我需要以某种方式重定向这些事件(即在usercontrol中创建该事件,并以某种方式将它们重定向到我的代码,我的代码指的是使用它们的表单)或任何其他方式来捕获这些事件


我已经看到了5个关于同一问题的主题,没有一个得到解决,有任何解决方法吗?

您需要使用以下代码将标签和图片框的
单击事件重定向到用户控件的
OnClick
事件:

public UserControl1()
{
   InitializeComponent();

   this.label1.Click += myClickEvent;
   this.pictureBox1.Click += myClickEvent;
}

private void myClickEvent(object sender, EventArgs e)
{
   this.OnClick(e);
}

您需要使用以下代码将标签和图片框的
单击事件重定向到用户控件的
OnClick
事件:

public UserControl1()
{
   InitializeComponent();

   this.label1.Click += myClickEvent;
   this.pictureBox1.Click += myClickEvent;
}

private void myClickEvent(object sender, EventArgs e)
{
   this.OnClick(e);
}

您需要使用以下代码将标签和图片框的
单击事件重定向到用户控件的
OnClick
事件:

public UserControl1()
{
   InitializeComponent();

   this.label1.Click += myClickEvent;
   this.pictureBox1.Click += myClickEvent;
}

private void myClickEvent(object sender, EventArgs e)
{
   this.OnClick(e);
}

您需要使用以下代码将标签和图片框的
单击事件重定向到用户控件的
OnClick
事件:

public UserControl1()
{
   InitializeComponent();

   this.label1.Click += myClickEvent;
   this.pictureBox1.Click += myClickEvent;
}

private void myClickEvent(object sender, EventArgs e)
{
   this.OnClick(e);
}

如果可以继承
标签
图片框
,请继承它们并覆盖
WndProc
,然后执行以下操作

protected override void WndProc(ref Message m)
{
    if (m.Msg == (int)WindowsMessage.WM_NCHITTEST)
    {
        m.Result = (IntPtr)(-1);//Transparent
        return;
    }
    base.WndProc(ref m);
}
如果没有,请使用此选项

public partial class MyUserControl : UserControl
{
    private TransparentWindow label;
    private TransparentWindow pic;

    public MyUserControl()
    {
        InitializeComponent();
    }

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);

        label = new TransparentWindow(label1);
        pic = new TransparentWindow(pictureBox1);
    }
}

class TransparentWindow : NativeWindow
{
    public TransparentWindow(Control control)
    {
        this.AssignHandle(control.Handle);
    }

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == (int)WindowsMessage.WM_NCHITTEST)
        {
            m.Result = (IntPtr)(-1);//Transparent
            return;
        }
        base.WndProc(ref m);
    }
}
可以找到WindowMessage枚举


如果您可以继承
标签和
图片框
,请继承它们并覆盖
WndProc
,然后执行以下操作

protected override void WndProc(ref Message m)
{
    if (m.Msg == (int)WindowsMessage.WM_NCHITTEST)
    {
        m.Result = (IntPtr)(-1);//Transparent
        return;
    }
    base.WndProc(ref m);
}
如果没有,请使用此选项

public partial class MyUserControl : UserControl
{
    private TransparentWindow label;
    private TransparentWindow pic;

    public MyUserControl()
    {
        InitializeComponent();
    }

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);

        label = new TransparentWindow(label1);
        pic = new TransparentWindow(pictureBox1);
    }
}

class TransparentWindow : NativeWindow
{
    public TransparentWindow(Control control)
    {
        this.AssignHandle(control.Handle);
    }

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == (int)WindowsMessage.WM_NCHITTEST)
        {
            m.Result = (IntPtr)(-1);//Transparent
            return;
        }
        base.WndProc(ref m);
    }
}
可以找到WindowMessage枚举


如果您可以继承
标签和
图片框
,请继承它们并覆盖
WndProc
,然后执行以下操作

protected override void WndProc(ref Message m)
{
    if (m.Msg == (int)WindowsMessage.WM_NCHITTEST)
    {
        m.Result = (IntPtr)(-1);//Transparent
        return;
    }
    base.WndProc(ref m);
}
如果没有,请使用此选项

public partial class MyUserControl : UserControl
{
    private TransparentWindow label;
    private TransparentWindow pic;

    public MyUserControl()
    {
        InitializeComponent();
    }

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);

        label = new TransparentWindow(label1);
        pic = new TransparentWindow(pictureBox1);
    }
}

class TransparentWindow : NativeWindow
{
    public TransparentWindow(Control control)
    {
        this.AssignHandle(control.Handle);
    }

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == (int)WindowsMessage.WM_NCHITTEST)
        {
            m.Result = (IntPtr)(-1);//Transparent
            return;
        }
        base.WndProc(ref m);
    }
}
可以找到WindowMessage枚举


如果您可以继承
标签和
图片框
,请继承它们并覆盖
WndProc
,然后执行以下操作

protected override void WndProc(ref Message m)
{
    if (m.Msg == (int)WindowsMessage.WM_NCHITTEST)
    {
        m.Result = (IntPtr)(-1);//Transparent
        return;
    }
    base.WndProc(ref m);
}
如果没有,请使用此选项

public partial class MyUserControl : UserControl
{
    private TransparentWindow label;
    private TransparentWindow pic;

    public MyUserControl()
    {
        InitializeComponent();
    }

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);

        label = new TransparentWindow(label1);
        pic = new TransparentWindow(pictureBox1);
    }
}

class TransparentWindow : NativeWindow
{
    public TransparentWindow(Control control)
    {
        this.AssignHandle(control.Handle);
    }

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == (int)WindowsMessage.WM_NCHITTEST)
        {
            m.Result = (IntPtr)(-1);//Transparent
            return;
        }
        base.WndProc(ref m);
    }
}
可以找到WindowMessage枚举


Matin Lotfaliee的回答绝对正确,但在我的情况下,如果我想将事件从一个控件转发到“其他控件”,您可能更喜欢一行程序:


Matin Lotfaliee的回答完全正确,但在我的情况下,如果我想将事件从一个控件转发到“其他控件”,您可能更喜欢一行程序:


Matin Lotfaliee的回答完全正确,但在我的情况下,如果我想将事件从一个控件转发到“其他控件”,您可能更喜欢一行程序:


Matin Lotfaliee的回答完全正确,但在我的情况下,如果我想将事件从一个控件转发到“其他控件”,您可能更喜欢一行程序:



解决方法可以是转发事件。将新事件添加到控件中,并在控件事件处理程序中提升它。我知道,这应该会起作用,但现在我需要订阅两个事件、我的自定义事件和其他本机事件,并且我必须为每个本机事件创建自定义事件,如果必须,我会这样做,但让我们看看是否有更神奇、更优雅的解决方案:)我明白了。看看我发现了什么。看起来“透明”控件可能适合您的需要,而且它更神奇:)解决方法可能是转发事件。将新事件添加到控件中,并在控件事件处理程序中提升它。我知道,这应该会起作用,但现在我需要订阅两个事件、我的自定义事件和其他本机事件,并且我必须为每个本机事件创建自定义事件,如果必须,我会这样做,但让我们看看是否有更神奇、更优雅的解决方案:)我明白了。看看我发现了什么。看起来“透明”控件可能适合您的需要,而且它更神奇:)解决方法可能是转发事件。将新事件添加到控件中,并在控件事件处理程序中提升它。我知道,这应该会起作用,但现在我需要订阅两个事件、我的自定义事件和其他本机事件,并且我必须为每个本机事件创建自定义事件,如果必须,我会这样做,但让我们看看是否有更神奇、更优雅的解决方案:)我明白了。看看我发现了什么。看起来“透明”控件可能适合您的需要,而且它更神奇:)解决方法可能是转发事件。将新事件添加到控件中,并在控件事件处理程序中提升它。我知道,这应该会起作用,但现在我需要订阅两个事件、我的自定义事件和其他本机事件,并且我必须为每个本机事件创建自定义事件,如果必须,我会这样做,但让我们看看是否有更神奇、更优雅的解决方案:)我明白了。看看我发现了什么。看起来“透明”控件可能适合您的需要,它更神奇:)+这是一个很好的解决方案。你不需要任何自定义事件。好的,很抱歉,我删除了我的旧评论(我的坏评论,我感到困惑,不得不删除它,那时还不知道你发布了什么)。你的答案是最好的,最简单的,最优雅的:)谢谢你+这是一个很好的解决方案。你不需要任何自定义事件。好的,很抱歉,我删除了我的旧评论(我的坏评论,我感到困惑,不得不删除它,那时还不知道你发布了什么)。你的答案是最好的,最简单的,最优雅的:)谢谢你+这是一个很好的解决方案。你不需要任何自定义事件。好的,很抱歉,我删除了我的旧评论(我的坏评论,我感到困惑,不得不删除它,那时还不知道你发布了什么)。你的答案是最好的,最简单的,最优雅的:)谢谢你+这是一个很好的解决方案。你不需要任何自定义事件。好的,很抱歉我删除了我的旧评论(我的坏消息我弄糊涂了,不得不删除它,那时还不知道你发布了什么)你的答案是最好的,最简单的,最优雅的:)谢谢you@MatinLotfaliee你还在报复吗?只是想和我的朋友打个招呼。“我知道我没有你那么博学,但你当时的评论是不公平的。”马丁洛法利,算了吧,伙计。如果你能教我一些我很乐意学的东西。同样,如果我能教你一些