为什么按钮处理点击的方式与非按钮不同

Why does a button handle a click differently to non-buttons

这听起来像是一个非常愚蠢的问题,但我注意到当我从 Button 或 [= 继承 class 时,自定义按钮的 Click 行为有所不同14=].

我正在开发一些具有自定义外观的控件,其中包括一个按钮。默认的用户控件 class 声明是这样的:

public partial class cButton : UserControl

添加所有 GUI 内容后,我将其添加到我的表单中并测试了点击行为。

当我快速连续单击该按钮时,它只会记录其他点击,甚至不会记录所有其他点击。我以为测试代码有问题,但是当我将确切的代码复制到一个普通的 Winforms 按钮时,无论多快,它都会记录每次点击。

编辑:如果我没有快速点击,用户控件会记录每次点击,即我在每次点击之间等待几秒钟。

我将自定义控件的 decleration 更改为从按钮 class 继承并且绝对没有对任何代码进行其他更改:

public partial class cButton : Button

当我进行点击测试时,自定义按钮表现良好,就像 winforms 按钮一样,没有错过任何点击。

只是为了测试一下,我在我的表单中添加了一个列表框,并在其点击事件中添加了相同的测试代码,它就像一个非按钮,只是偶尔注册一次点击。

我认为应该一致地处理点击,但显然并没有那么简单。

由此产生的问题:

What does a button do differently and what could I do to ensure proper click-behaviour when it is not possible to inherit from a Button?

我认为您遇到的问题是,如果您点击按钮的速度太快,它会注册为 double-click 而不是点击。您可以通过写入 double-click 上的输出来检查这一点,这样如果您的代码没有触发,请检查 double-click 事件是否触发。

您的自定义 UserControl 区分单击和双击。

要使其像按钮一样操作,您需要设置 StandardDoubleClick 控件样式,以便当用户快速连续单击两次时,控件会注册两个 single 点击并引发两个点击事件,而不是双击事件。

在构造函数中添加以下语句:

this.SetStyle(ControlStyles.StandardDoubleClick, false);