2009-06-30 11 views
9

Chciałbym móc przechwytywać zdarzenia DoubleClick lub MouseDoubleClick ze standardowego przycisku opcji WinForm, ale wydaje się, że są one ukryte i nie działają. W tej chwili mam kod jak to:Jak uzyskać zdarzenie DoubleClick w przycisku radiowym .NET?

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

Czy istnieje prostszy i czystszy sposób to zrobić?

Edit: W tle, zgadzam się z Raymond Chen postu here że zdolność dwukrotnie kliknąć na przycisku radiowego (jeśli takie są tylko kontrole oknie) sprawia, że ​​dialog tylko odrobinę łatwiejsza w użyciu ludzie, którzy o tym wiedzą.

W Vista przy użyciu okien dialogowych zadań (patrz this Microsoft guideline page lub this MSDN page specifically about the Task Dialog API) byłoby oczywistym rozwiązaniem, ale nie mamy tego luksusu.

Odpowiedz

10

Na podstawie oryginalnej sugestii stworzyłem rozwiązanie bez potrzeby podklasy radiobutonu za pomocą odbicia:

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; 

Teraz zdarzenie podwójnego kliknięcia dla przycisku radiowego jest uruchamiane. BTW: Sugestia Nate przy użyciu e.Clicks nie działa. W moich testach e.Clicks był zawsze 1 bez względu na to, jak szybko lub często kliknąłem radiobutton.

3

Można zrobić coś takiego:

myRadioButton.MouseClick += new MouseEventHandler(myRadioButton_MouseClick); 

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

Może lub nie może również sprawdzić, które e.Button == MouseButtons.Left

+0

jestem akceptując ten jeden, ponieważ chociaż wydaje mi się, że moje własne rozwiązanie jest prostsze w moim przypadku, w którym zamierzam używać tej samej kontroli wiele razy, jeśli ktoś po prostu chciał jeden lub dwa, wtedy twoja jest znacznie prostsza. – Ant

+2

Wygląda na to, że nie działa na platformie .NET 3.5, ponieważ kliknięcia == 2 nigdy się nie zdarzają. – Wernight

+0

To też nie zdarza się w .NET 4.0, więc przełączam zaakceptowaną odpowiedź na opartą na refleksji przez MSW. – Ant

0

Niestety, nie mają reputację aby skomentować na to. Jaką akcję chcesz wykonać dla użytkownika dwukrotnie? Myślę, że dwukrotne kliknięcie może być mylące, ponieważ różni się od ogólnego modelu mentalnego użytkownika przycisku radiowego (IE jedno kliknięcie, wybierz jedną opcję ze zbioru).

+0

Dobra uwaga. Zaktualizuję pytanie: – Ant

+0

Ach, rozumiem. Używasz podwójnego kliknięcia jako skrótu do wyboru + dalej. To ma sens. Myślę, że przedstawiony przez ciebie kod jest najczystszym sposobem na zrobienie tego. Wygląda na to, że funkcjonalność MS starała się celowo zakopać radiobutton. – Ehz

+0

Tak właśnie pomyślałem :(Dzięki za informację zwrotną. – Ant

1

podstawie @MSW odpowiedź, zrobiłem tę klasę rozszerzenia:

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

który następnie jest bardzo łatwy w konfiguracji i ponowne wykorzystanie:

radioButton.AllowDoubleClick((a, b) => myDoubleClickAction()); 
Powiązane problemy