如何在 .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 事件?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取单选按钮值并清除表中选中的单选按钮

如何在 ajax 中获取单选按钮值?

在java中性别是单选按钮,如何把性别添加到数据库中

java如何获取单选按钮RadioButton的值?

如何在组合框中获取已选中的单选按钮?

如何从插入到 innerHtml 的单选按钮中获取值