blu*_*rnd 6 c# events containers
我有一个继承自Button的MyButton类.在这个课程中,我已经放置了其他几个控件(Labels,Progessbar).这样做的问题是Button上的控件使得无法触发Button.Click或Button.MouseHover事件.如何才能实现按钮上的控件仅显示但是"事件透明":标签和progessbar上的单击/悬停与我直接单击/悬停在按钮上(包括发件人和所有内容)相同.像"继承父母的事件"之类的东西.
class MyButton : Button
{
    Label foo = new Label();
    ProgressBar bar = new ProgessBar();
}
正如您所发现的,让子控件成为按钮前面的真实控件(无论是在从 继承Button还是从继承的类中UserControl)可能会使按钮特定的事件很难正常工作。  (编辑:虽然很难,但并非不可能——参见 Hans Passant 的回答)
作为解决方法,您可以将它们自定义绘制到按钮表面,而不是使用子控件,因为您不需要控件的大部分功能(事件、聚焦等),只需要它们的显示。
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()。
有关更完整的示例,请参阅CodeProject 上的使用 C# 的自定义位图按钮。