Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.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#,集装箱火灾事件_C#_Events_Containers - Fatal编程技术网

C#,集装箱火灾事件

C#,集装箱火灾事件,c#,events,containers,C#,Events,Containers,我有一个从Button继承的MyButton类。在这个类中,我放置了几个其他控件(标签、Progessbar)。问题是按钮上的控件使无法启动按钮。单击或按钮。鼠标悬停事件。如何实现按钮上的控件仅显示但“事件透明”:标签和进度栏上的单击/悬停与我直接单击/悬停按钮(包括发送者和所有内容)相同。类似于“从父级继承事件” 您应该从UserControl派生,然后将button作为子控件,并在单击时弹出button子控件的事件 这可能比你需要的更多,但这是一个很好的起点 更新 如前所述,您可能没有使用A

我有一个从Button继承的MyButton类。在这个类中,我放置了几个其他控件(标签、Progessbar)。问题是按钮上的控件使无法启动按钮。单击或按钮。鼠标悬停事件。如何实现按钮上的控件仅显示但“事件透明”:标签和进度栏上的单击/悬停与我直接单击/悬停按钮(包括发送者和所有内容)相同。类似于“从父级继承事件”


您应该从UserControl派生,然后将button作为子控件,并在单击时弹出button子控件的事件

这可能比你需要的更多,但这是一个很好的起点

更新
如前所述,您可能没有使用ASP.NET。还有一篇文章谈到了不同的自定义用户控件,特别是你想要的是一个
复合控件。这是针对Windows窗体的。

此答案刚才还在此处,但已被删除:


您可以从
UserControl
继承吗?这将允许您在控件表面上放置其他控件,包括您的按钮并订阅其事件。

让子控件成为按钮前面的真实控件(在继承自
按钮的类中或从
用户控件的类中)可能会使特定于按钮的事件难以正常工作,正如你所发现的。(编辑:虽然这很难,但并非不可能——参见汉斯·帕桑的回答)

作为一种解决方法,您可以不使用子控件,而是在按钮表面自定义绘制它们,因为您不需要控件的大部分功能(事件、聚焦等),只需要它们的显示

您可以在类的
OnPaint
方法中进行额外的绘制。比如:

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);
    e.Graphics.DrawString("My fake label", Font, 
                          SystemBrushes.ControlText, new Point(10, 10))
    // draw progressbar
}
要更新显示,您需要使用
Invalidate()
触发按钮的重新绘制


请看一个更完整的示例。

如果您使用的是WPF,我猜您要查找的将是名为冒泡事件的内容。它是WPF中的一个特性,通过它事件从控件冒泡到其父控件(在您的情况下,它将从ProgressBar和标签到按钮)。我找到了我认为对你有帮助的东西


希望这有帮助:)

为标签和PB编写单击事件处理程序,让它们调用PerformClick()


使控件对鼠标透明是可能的,但做起来很难看。您必须重写WndProc()以捕获WM_NCHITTEST并返回HTTRANSPARENT。更好的全面解决方案是不使用控件。标签只是按钮绘制事件中的TextRenderer.DrawText()。ProgressBar也不难,例如Graphics.FillRectangle()。

听起来他好像没有使用asp.net(基于他的示例代码中ProgressBar的存在)。我的观点是好的,假设是坏的。我将找到一个适用于winforms(或WPF?)的示例
protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);
    e.Graphics.DrawString("My fake label", Font, 
                          SystemBrushes.ControlText, new Point(10, 10))
    // draw progressbar
}