2009-06-30 13 views
9

Ich möchte die DoubleClick- oder MouseDoubleClick-Ereignisse von einem standardmäßigen winforms-Optionsfeld abfangen können, aber sie scheinen ausgeblendet zu sein und funktionieren nicht. Im Moment hat ich Code wie folgt:Wie erhalte ich ein DoubleClick-Ereignis in einem .NET-Optionsfeld?

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); 
     } 
    } 
} 

Gibt es einen einfachen und sauberen Weg, es zu tun?

Edit: Für Hintergrund, ich bin einverstanden mit Raymond Chen Post here, dass die Fähigkeit, klicken Sie auf ein Optionsfeld zu verdoppeln (wenn diejenigen, die nur Steuerelemente im Dialog sind), um den Dialog macht nur ein kleines bisschen leichter zu bedienen Leute, die davon wissen.

In Vista mit Task-Dialoge (siehe this Microsoft guideline page oder this MSDN page specifically about the Task Dialog API) wäre die offensichtliche Lösung, aber wir haben nicht den Luxus, dass.

Antwort

10

Basierend auf Ihrem ursprünglichen Vorschlag I eine Lösung ohne die Notwendigkeit machte die radiobuton mit Reflexion Unterklasse:

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; 

Nun ist das Doppelklick-Ereignis für die Radiobutton ausgelöst wird. BTW: Der Vorschlag von Nate mit e.Clicks funktioniert nicht. In meinen Tests war e.Clicks immer 1 egal wie schnell oder oft ich den Radiobutton geklickt habe.

3

Sie so etwas tun könnte:

myRadioButton.MouseClick += new MouseEventHandler(myRadioButton_MouseClick); 

void myRadioButton_MouseClick(object sender, MouseEventArgs e) 
{ 
    if (e.Clicks == 2) 
    { 
     // Do something 
    } 
} 

Sie können oder auch nicht überprüfen möchten, dass e.Button == MouseButtons.Left

+0

ich diese eine Annahme, denn obwohl ich denke, dass meine eigene Lösung für meinen Fall einfacher ist, wo ich die gleiche Kontrolle viele Male verwenden werde, wenn jemand nur ein oder zwei wollte, dann ist deins viel einfacher. – Ant

+2

Dies scheint nicht auf .NET 3.5 zu arbeiten, da die Klicks == 2 nie passiert. – Wernight

+0

Dies passiert auch nicht in .NET 4.0, also wechsle ich die akzeptierte Antwort auf die Reflektionsbasierte über MSW. – Ant

0

Sorry, nicht den Ruf zu kommentieren darauf. Welche Aktion versuchen Sie mit dem Doppelklick für den Benutzer auszuführen? Ich denke, ein Doppelklick kann verwirrend sein, weil es sich von dem allgemeinen mentalen Modell unterscheidet, das ein Benutzer von einem Radioknopf hat (IE Einzelklick, wähle eine Option aus einem Satz)

+0

Guter Punkt. Ich werde die Frage aktualisieren – Ant

+0

Ah, ich verstehe. Sie verwenden den Doppelklick als Verknüpfung zum Auswählen von + next. Das macht Sinn. Ich denke, dass der Code, den Sie vorgestellt haben, der sauberste Weg ist, dies zu tun. Es sieht so aus, als ob MS diese Funktionalität absichtlich für den Radiobutton vergraben wollte. – Ehz

+0

Das habe ich mir gedacht :(Danke für die Rückmeldung. – Ant

1

Basierend auf @MSW Antwort, habe ich diese Erweiterung Klasse:

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; 
    } 
} 

die dann super einfach einzurichten und Wiederverwendung:

radioButton.AllowDoubleClick((a, b) => myDoubleClickAction()); 
Verwandte Themen