2011-03-22 121 views
6

我有一个继承自Button的MyButton类。在这门课上,我已经放置了其他几个控件(标签,Progessbar)。问题在于Button上的控件使得无法触发Button.Click或Button.MouseHover事件。我如何才能实现按钮上的控件只显示“事件透明”:标签和progessbar上的单击/悬停与单击/直接悬停在按钮上(包括发件人和所有内容)相同。就像“从父母继承事件”。C#,容器火灾事件

class MyButton : Button 
{ 
    Label foo = new Label(); 
    ProgressBar bar = new ProgessBar(); 
} 
+4

WinForms或WPF? – 2011-03-22 16:46:06

回答

1

具有子控件是真正的控制在按钮前(无论是在一类从ButtonUserControl继承)可能使其很难找到特定的按钮事件工作正常,因为你已经找到。 (编辑:虽然这很难,但不是不可能的 - 看到汉斯帕桑特的答案)

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

您可以在班级的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()按钮的重绘。

查看Custom Bitmap Button Using C# on CodeProject获取更完整的示例。

4

您应该派生自UserControl,然后将该按钮作为子控件,并在点击事件时将按钮子按钮向上冒泡。

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

UPDATE 正如指出的那样,您可能没有使用ASP.NET。所以here是另一篇文章,讲述了不同的自定义用户控件,具体来说你以后是Composite Control。这是Windows窗体。

+0

这听起来像是他不使用asp.net(基于他的示例代码中存在ProgressBar) – 2011-03-22 16:45:45

+0

好点,我的错误假设。我会找到一个适用于winforms(或WPF?)的示例 – CodingGorilla 2011-03-22 16:48:41

0

这个答案在这里刚才,但删除了:

你能从UserControl而不是继承?这将允许您在控制界面上放置其他控件,包括您的按钮并订阅他们的活动。

0

如果你使用的是WPF,我猜你在找什么叫做Bubbled Events。这是WPF中的一个功能,通过这个功能,从控件向其父级冒泡(在您的情况下,它将从您的ProgressBar和Label到您的按钮)。我发现this article on the matter,我认为这对你有帮助。

希望这有助于:)

3

写Click事件处理程序的标签和PB,可以打电话PerformClick()。

使控件对鼠标透明是可能的,但很难做到。你必须重写WndProc()来捕获WM_NCHITTEST并返回HTTRANSPARENT。全面的更好的解决方案是不使用控件。标签仅仅是按钮的Paint事件中的TextRenderer.DrawText()。 ProgressBar也不难,e.Graphics.FillRectangle()。