如何在 .NET 单选按钮中获取 DoubleClick 事件?
Posted
技术标签:
【中文标题】如何在 .NET 单选按钮中获取 DoubleClick 事件?【英文标题】:How do I get a DoubleClick event in a .NET radio button? 【发布时间】:2010-11-07 00:55:54 【问题描述】:我希望能够从标准的 winforms 单选按钮捕获 DoubleClick 或 MouseDoubleClick 事件,但它们似乎被隐藏并且不起作用。目前我有这样的代码:
public class RadioButtonWithDoubleClick : RadioButton
public RadioButtonWithDoubleClick()
: base()
this.SetStyle( ControlStyles.StandardClick | ControlStyles.StandardDoubleClick, true );
[EditorBrowsable( EditorBrowsableState.Always ), Browsable( true )]
public new event MouseEventHandler MouseDoubleClick;
protected override void OnMouseDoubleClick( MouseEventArgs e )
MouseEventHandler temp = MouseDoubleClick;
if( temp != null )
temp( this, e );
有没有更简单更干净的方法?
编辑:对于背景,我同意 Raymond Chen 的帖子 here 双击单选按钮的能力(如果这些是对话框上的 only 控件)使对话框只是一个对于了解它的人来说,使用起来稍微容易一些。
在 Vista 中使用任务对话框(请参阅 this Microsoft guideline page 或 this MSDN page specifically about the Task Dialog API)是显而易见的解决方案,但我们没有这种奢侈。
【问题讨论】:
【参考方案1】:你可以这样做:
myRadioButton.MouseClick += new MouseEventHandler(myRadioButton_MouseClick);
void myRadioButton_MouseClick(object sender, MouseEventArgs e)
if (e.Clicks == 2)
// Do something
您可能也可能不想检查 e.Button == MouseButtons.Left
【讨论】:
我接受这个,因为虽然我认为我自己的解决方案对于我的情况来说更简单,我将多次使用相同的控件,如果有人只想要一两个然后你的要简单得多。 这似乎不适用于 .NET 3.5,因为 Clicks == 2 从未发生过。 这在 .NET 4.0 中也不会发生,所以我将接受的答案切换为 MSW 的基于反射的答案。【参考方案2】:抱歉,没有资格对此发表评论。您试图让用户双击执行什么操作?我认为使用双击可能会造成混淆,因为它不同于用户对单选按钮的一般心理模型(IE 单击,从一组中选择一个选项)
【讨论】:
啊,我明白了。您正在使用双击作为 select+next 的快捷方式。这就说得通了。我认为您提供的代码是解决此问题的最干净的方法。看起来这是 MS 试图故意为单选按钮隐藏的功能。 我就是这么想的 :( 感谢您的反馈。【参考方案3】:根据您最初的建议,我提出了一个解决方案,无需使用反射对单选按钮进行子类化:
MethodInfo m = typeof(RadioButton).GetMethod("SetStyle", BindingFlags.Instance | BindingFlags.NonPublic);
if (m != null)
m.Invoke(radioButton1, new object[] ControlStyles.StandardClick | ControlStyles.StandardDoubleClick, true );
radioButton1.MouseDoubleClick += radioButton1_MouseDoubleClick;
现在触发单选按钮的双击事件。 顺便说一句:Nate 使用 e.Clicks 的建议不起作用。在我的测试中,无论我单击单选按钮的速度或频率如何,e.Clicks 始终为 1。
【讨论】:
【参考方案4】:根据@MSW 的回答,我做了这个扩展类:
static class RadioButtonEx
public static void AllowDoubleClick(this RadioButton rb, MouseEventHandler MouseDoubleClick)
//
// Allow double clicking of radios
System.Reflection.MethodInfo m = typeof(RadioButton).GetMethod("SetStyle", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
if (m != null)
m.Invoke(rb, new object[] ControlStyles.StandardClick | ControlStyles.StandardDoubleClick, true );
rb.MouseDoubleClick += MouseDoubleClick;
然后超级容易设置和重复使用:
radioButton.AllowDoubleClick((a, b) => myDoubleClickAction());
【讨论】:
以上是关于如何在 .NET 单选按钮中获取 DoubleClick 事件?的主要内容,如果未能解决你的问题,请参考以下文章