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