C# 如何重定向usercontrol上的事件
我有一个用户控件,非常简单,只有一个标签和一个picturebox,它们是固定的,你甚至看不到底层 大多数事件从未发生(单击、悬停等) 我认为(我可能错了),这是因为事件不会被触发,因为它们被点击在标签或图片盒上,而不是在背景上 我需要以某种方式重定向这些事件(即在usercontrol中创建该事件,并以某种方式将它们重定向到我的代码,我的代码指的是使用它们的表单)或任何其他方式来捕获这些事件C# 如何重定向usercontrol上的事件,c#,.net,winforms,user-controls,C#,.net,Winforms,User Controls,我有一个用户控件,非常简单,只有一个标签和一个picturebox,它们是固定的,你甚至看不到底层 大多数事件从未发生(单击、悬停等) 我认为(我可能错了),这是因为事件不会被触发,因为它们被点击在标签或图片盒上,而不是在背景上 我需要以某种方式重定向这些事件(即在usercontrol中创建该事件,并以某种方式将它们重定向到我的代码,我的代码指的是使用它们的表单)或任何其他方式来捕获这些事件 我已经看到了5个关于同一问题的主题,没有一个得到解决,有任何解决方法吗?您需要使用以下代码将标签和图片
我已经看到了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你还在报复吗?只是想和我的朋友打个招呼。“我知道我没有你那么博学,但你当时的评论是不公平的。”马丁洛法利,算了吧,伙计。如果你能教我一些我很乐意学的东西。同样,如果我能教你一些