我希望能够从一个标准的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的帖子在这里 ,要双击一个单选按钮(如果这些都是该对话框上的唯一控制)的能力,使对话只是一点点更容易使用,谁知道这件事的人。
在Vista中使用任务对话框(请参阅此Microsoft指南页面或本页面MSDN特别是约的任务对话框API )将是显而易见的解决方案,但我们没有的,奢侈。
根据原来的建议,我做了一个解决方案,而无需使用反射子类radiobuton:
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;
现在的单选按钮的双击事件。 BTW:内特使用e.Clicks的建议是行不通的。 在我的测试e.Clicks总是1不管多么快或经常我点击了单选按钮。
你可以这样做:
myRadioButton.MouseClick += new MouseEventHandler(myRadioButton_MouseClick);
void myRadioButton_MouseClick(object sender, MouseEventArgs e)
{
if (e.Clicks == 2)
{
// Do something
}
}
您可能会或可能不会还想要检查e.Button == MouseButtons.Left
基于@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());
对不起,没有信誉对此置评。 你想有什么作用双击用户执行? 我想用双击可能会产生混淆,因为它是从一个用户有一个单选按钮一般心智模式不同(IE单一的点击,选择一组一个选项)