【问题标题】:How do I get a DoubleClick event in a .NET radio button?如何在 .NET 单选按钮中获取 DoubleClick 事件?
【发布时间】: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 pagethis MSDN page specifically about the Task Dialog API)是显而易见的解决方案,但我们没有这种奢侈。

【问题讨论】:

    标签: .net winforms radio-button double-click


    【解决方案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());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-10
        • 1970-01-01
        • 2015-09-08
        • 2013-09-04
        • 2011-07-28
        • 1970-01-01
        • 2012-06-25
        相关资源
        最近更新 更多