2009-06-30 20 views
9

मैं मानक Winforms रेडियो बटन से DoubleClick या MouseDoubleClick ईवेंट को पकड़ने में सक्षम होना चाहता हूं, लेकिन वे छिपे हुए हैं और काम नहीं कर रहे हैं।मैं .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); 
     } 
    } 
} 

वहाँ यह करने के लिए एक सरल और क्लीनर तरीका है: इस समय मैं इस तरह कोड है?

संपादित करें: पृष्ठभूमि के लिए, मैं रेमंड चेन के पद here कि दोगुना करने के लिए एक रेडियो बटन पर क्लिक करें (अगर उन संवाद पर केवल नियंत्रण कर रहे हैं) की क्षमता संवाद सिर्फ एक छोटे से थोड़ा आसान के लिए उपयोग करने के लिए बनाता है के साथ सहमत जो लोग इसके बारे में जानते हैं।

कार्य संवाद का उपयोग कर Vista में (this Microsoft guideline page या this MSDN page specifically about the Task Dialog API देखें) स्पष्ट समाधान होगा, लेकिन हमारे पास इसकी लक्जरी नहीं है।

उत्तर

10

आपके मूल सुझाव के आधार पर I

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; 

अब radiobutton के लिए डबल क्लिक करें घटना निकाल दिया जाता है: radiobuton का उपयोग कर प्रतिबिंब उपवर्ग की आवश्यकता के बिना एक समाधान कर दिया। बीटीडब्लू: e.Clicks का उपयोग कर नेट का सुझाव काम नहीं करता है। मेरे परीक्षणों में ई। क्लिक हमेशा 1 थी, इससे कोई फर्क नहीं पड़ता कि मैंने रेडियोबटन पर कितनी तेजी से या अक्सर क्लिक किया था।

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

कौन सा की स्थापना की और फिर से उपयोग करने के लिए तो सुपर आसान है::

3

आप कुछ इस तरह कर सकता है:

myRadioButton.MouseClick += new MouseEventHandler(myRadioButton_MouseClick); 

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

आप या भी है कि e.Button == MouseButtons.Left

+0

मैं इस एक को स्वीकार कर रहा हूँ, क्योंकि हालांकि मुझे लगता है कि मेरा खुद का समाधान मेरे मामले के लिए आसान है, जहां मैं कई बार एक ही नियंत्रण का उपयोग करने जा रहा हूं, अगर कोई सिर्फ एक या दो चाहता है तो आपका बहुत आसान है। – Ant

+2

यह .NET 3.5 पर काम नहीं कर रहा है क्योंकि क्लिक == 2 कभी नहीं होता है। – Wernight

+0

यह .NET 4.0 में नहीं होता है, इसलिए मैं एमएसडब्लू द्वारा प्रतिबिंब आधारित एक स्वीकृत उत्तर को बदल रहा हूं। – Ant

0

क्षमा करें, प्रतिष्ठा की जरूरत नहीं है टिप्पणी करने के लिए जाँच करने के लिए नहीं चाहते हो सकता है हो सकता है इस पर। उपयोगकर्ता के लिए डबल-क्लिक करने का प्रयास करने का आप क्या प्रयास कर रहे हैं? मुझे लगता है कि डबल-क्लिक का उपयोग भ्रमित हो सकता है क्योंकि यह सामान्य मानसिक मॉडल से अलग है कि उपयोगकर्ता के पास रेडियो-बटन (आईई सिंगल क्लिक, सेट से एक विकल्प का चयन करें)

+0

अच्छा बिंदु। मैं प्रश्न – Ant

+0

आह अपडेट करूंगा, मैं देखता हूं। आप चयन + अगली के लिए शॉर्टकट के रूप में डबल-क्लिक का उपयोग कर रहे हैं। यह समझ आता है। मुझे लगता है कि आपके द्वारा प्रस्तुत कोड इस बारे में जाने का सबसे साफ तरीका है। ऐसा लगता है कि यह कार्यक्षमता है कि एमएस ने जानबूझकर रेडियोबूटन के लिए दफनाने की कोशिश की। – Ehz

+0

मैंने यही पाया :(प्रतिक्रिया के लिए धन्यवाद। – Ant

1

@MSW जवाब के आधार पर, मैं इस विस्तार के वर्ग बनाया

radioButton.AllowDoubleClick((a, b) => myDoubleClickAction()); 
संबंधित मुद्दे