为什么按钮处理点击事件与非按钮不同

3
这可能听起来是一个非常愚蠢的问题,但我注意到当我从ButtonUserControl继承我的类时,自定义按钮的Click行为会有所不同。
我正在开发一些具有自定义外观的控件,其中包括按钮。默认用户控件类声明如下:
public partial class cButton : UserControl

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

当我快速连续点击按钮时,它仅注册每隔一个点击,甚至不是每个点击。我以为测试代码有问题,但是当我将完全相同的代码复制到普通的Winforms按钮上时,无论多快都可以注册每个点击。

编辑:如果我不快速点击即等待几秒钟后再点击,则用户控件会注册每个点击。

我将我的自定义控件声明更改为从按钮类继承,并对任何其他代码进行了绝对不改变:

public partial class cButton : Button

当我进行点击测试时,自定义按钮的行为良好,就像winforms按钮一样,不会错过任何一个点击。
只是为了测试,我向我的表单添加了一个列表框,并将相同的测试代码添加到其单击事件中,它的行为像一个非按钮,只在偶尔注册点击。
我认为点击应该被一致地处理,但显然这并不简单。
由此产生的问题是:
按钮有什么不同之处,如果无法继承自按钮,我该怎么做才能确保正确的点击行为?

两个问题:当鼠标按钮按下还是释放时,Button 的 Click 事件会被触发?另外:有些 UserControl 的点击事件会被误解为双击(因此被跳过)? - Kuba Wyrostek
@Kuba:我刚刚测试了一下,当按下鼠标按钮并将其保持几秒钟时,对于按钮和其他控件,仅在释放鼠标时才触发事件。 - ChP
好的,那双击怎么样? - Kuba Wyrostek
好的,我首先注意到一个按钮没有双击功能,而其他控件有。当我为双击事件添加一些代码时,单击代码会在第一次鼠标释放时触发,而双击代码则在第二次触发。我的答案可能在下面的@Charles所说。 - ChP
2个回答

1
你的自定义UserControl可以区分单击和双击。
为了使其像按钮一样工作,需要设置StandardDoubleClick控件样式,这样当用户快速连续点击两次时,控件会注册两个单击事件并触发两个单击事件,而不是一个双击事件。
在构造函数中添加以下语句:
this.SetStyle(ControlStyles.StandardDoubleClick, false);

此外,对于要用作按钮的控件,实现IButton接口也可能很有趣。除了需要实现PerformClick()方法之外,还有其他一些有用的东西可能会引起您的兴趣,例如使用表单的AcceptButtonCancelButton属性。 - Lemonseed
谢谢。这些是一些非常好的建议,也是我正在寻找的实际答案。 - ChP

1
我认为你遇到的问题是,如果你点击按钮太快,它会被识别为双击而不是单击。你可以通过在双击时向输出写入来检查此问题,以便如果你的代码没有触发,请检查是否出现了双击事件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接