【问题标题】:Custom Control that exposes Button Control's OnClick event公开按钮控件的 OnClick 事件的自定义控件
【发布时间】:2013-11-14 22:32:37
【问题描述】:

我需要设计一个自定义控件,它基本上是一个花哨的按钮,我们称之为CtrlButton

我想将这些放在我的空白表单上,然后转到我的控件的事件并指定要为 Click 事件做什么。

如果我的自定义控件 CtrlButton 包含 1 个名为 button1 的 Windows 窗体按钮,我是否可以简单地公开 button1 的底层 Click 事件处理程序?

public EventHandler Click {
  get { return button1.Click; }
  set { button1.Click = value; }
}

此代码不起作用!但是,这基本上就是我想要做的。

编辑:我看到我因这篇文章获得了热门问题,但它仍然在 -1 处。如果这个问题可以帮助您找到答案,请投票。

【问题讨论】:

  • 派生自 Button,而不是 UserControl。用户控件并不意味着是可点击的项目,它意味着是其他控件的包。很像形式。当你从 Button 派生时,你不必对 Click 做任何事情,你只需继承常规和理智的行为。
  • 引用自常见问题解答:如果您对自己的贡献由其他受信任的用户协作编辑的想法感到不满意,那么这可能不适合您。跨度>

标签: c# winforms event-handling


【解决方案1】:

Button.Click 是一个事件,而不是一个属性。你不能获取和设置它的值,因为它不是一个属性;您只能添加和删除处理程序,因为它是一个事件,这就是事件的工作方式。

但是您可以使用包装 Button 的自定义 addremove 处理程序编写自己的事件:

public event EventHandler Click {
    add { button1.Click += value; }
    remove { button1.Click -= value; }
}

【讨论】:

  • 这正是我最初的问题所要求的,这就是我目前解决问题的方式。最终,我可能会采用 Gregory A Beamer 的方法并继承 Button,但不是今天。
【解决方案2】:

如果这是从标准 Button 控件派生的,如下所示:

using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsControlLibrary1
{
   public class RedButton : Button
   {
       public RedButton()
       {
           base.BackColor = Color.Red;
       }
   }
}

事件可用。如果您已完全自定义以制作自己的按钮,则必须连接所有事件,ala this post

【讨论】:

  • OK, that works - but how would I create a button that has a border around it that turns Yellow when selected and Red when that selection is not valid? (这是我的规格表的要求)目前,我有一个 Button 居中在 Panel 控件内,我可以更改 BackColor on。
  • 您仍然可以覆盖本机事件并执行您希望的操作。或者,如果你觉得非常好色,你可以写新的。 :-)。现在,如果您需要整个面板,则可以使用标准的“自定义控件”模板,因为您要合并很多控件。这样做时,您必须创建事件以映射到控制事件。但是,如果这只是您需要的按钮,请尝试从按钮继承,然后对公开的事件进行编码以执行您想要的操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-14
  • 1970-01-01
相关资源
最近更新 更多