2009-06-09 18 views
14

मुझे एक ही क्लिक और दोनों प्रतिक्रियाओं के साथ एक WPF अनुप्रयोग में बटन के डबल क्लिक को संभालना होगा। दुर्भाग्यवश, डबलक्लिक पर, डब्ल्यूपीएफ दो क्लिक इवेंट और डबल क्लिक इवेंट चलाता है, इसलिए इस स्थिति को संभालना मुश्किल है।डब्ल्यूपीएफ: बटन एकल क्लिक + डबल क्लिक इश्यू

यह टाइमर का उपयोग करके इसे हल करने की कोशिश की लेकिन सफलता के बिना ... मुझे उम्मीद है कि आप मेरी मदद कर सकते हैं।

कोड देखते हैं:

private void delayedBtnClick(object statInfo) 
{ 
    if (doubleClickTimer != null) 
     doubleClickTimer.Dispose(); 
    doubleClickTimer = null; 

    this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new VoidDelegate(delegate() 
    { 
     // ... DO THE SINGLE CLICK ACTION 
    })); 
} 

private void btn_Click(object sender, RoutedEventArgs e) 
{ 
    if (doubleClickTimer == null) 
     doubleClickTimer = new Timer(delayedBtnClick, null, System.Windows.Forms.SystemInformation.DoubleClickTime, Timeout.Infinite); 
     } 
    } 
} 

private void btnNext_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
{ 
    if (doubleClickTimer != null) 
     doubleClickTimer.Change(Timeout.Infinite, Timeout.Infinite); // disable it - I've tried it with and without this line 
     doubleClickTimer.Dispose(); 
    doubleClickTimer = null; 

    //.... DO THE DOUBLE CLICK ACTION 
} 

समस्या यह है कि 'सिंगल क्लिक कार्रवाई' DoubleClick पर 'डबल क्लिक कार्रवाई' के बाद कहा जाता है। यह अजीब मैं doubleClickTimer सेट कि डबल क्लिक पर शून्य पर है, लेकिन delayedBtnClick में यह सच है: हे

मैं पहले से ही लंबे समय, एक bool झंडा और लॉक का उपयोग करने के लिए कोशिश की है ...

आप किसी भी है विचार?

बेस्ट!

उत्तर

16

आप सेट करते हैं RoutedEvent के e.Handledtrue को MouseDoubleClick घटना से निपटने के बाद तो यह Click घटना MouseDoubleClick के बाद दूसरी बार फोन नहीं होंगे।

recent post है जो SingleClick और DoubleClick के लिए अलग-अलग व्यवहार होने पर छूता है जो उपयोगी हो सकता है।

हालांकि, अगर आप सुनिश्चित हैं कि आप अलग व्यवहार करना चाहते हैं और चाहते हैं/आप DispatcherTimer उपयोग कर सकते हैं जैसे आप थे, दूसरी Click के रूप में पहली Click ब्लॉक करने के लिए और साथ ही जरूरत है।

private static DispatcherTimer myClickWaitTimer = 
    new DispatcherTimer(
     new TimeSpan(0, 0, 0, 1), 
     DispatcherPriority.Background, 
     mouseWaitTimer_Tick, 
     Dispatcher.CurrentDispatcher); 

private void Button_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
{ 
    // Stop the timer from ticking. 
    myClickWaitTimer.Stop(); 

    Trace.WriteLine("Double Click"); 
    e.Handled = true; 
} 

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    myClickWaitTimer.Start(); 
} 

private static void mouseWaitTimer_Tick(object sender, EventArgs e) 
{ 
    myClickWaitTimer.Stop(); 

    // Handle Single Click Actions 
    Trace.WriteLine("Single Click"); 
} 
+0

बहुत बहुत धन्यवाद! ई। हैंडल = सच चाल थी! तेज प्रतिक्रिया के लिए फिर से धन्यवाद :) – Hunsoul

+1

यदि आप डिस्पैचर टिमर के लिए उस कन्स्ट्रक्टर का उपयोग करते हैं तो टाइमर तुरंत शुरू होता है जो एक नकली एकल क्लिक ईवेंट का कारण बनता है। इसके अलावा पृष्ठभूमि और वर्तमान डिफ़ॉल्ट मान हैं इसलिए चीजों को थोड़ा उलझन में रखें (सोचा था कि वहां कुछ वूडू चल रहा है!)। हालांकि बहुत उपयोगी - चीयर्स! –

+0

मुझे कोड में DoubleClickTime का उपयोग नहीं दिख रहा है। इसके बजाय मैं एक हार्ड कोडित देरी देखता हूं। क्या यह सामान्य है? – SandRock

6

आप इस कोशिश कर सकते:

Button.MouseLeftButtonDown += Button_MouseLeftButtonDown; 

private void Button_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    e.Handled = true; 

    if (e.ClickCount > 1) 
    { 
     // Do double-click code 
    } 

    else 
    { 
     // Do single-click code 
    } 
} 

आवश्यक हैं, तो आप माउस क्लिक की आवश्यकता होती है और माउस तक इंतजार ऊपर कार्रवाई करने के लिए कर सकता है।

+0

आपके उत्तर के लिए धन्यवाद! मैंने कोशिश नहीं की है क्योंकि पहली सिफारिश ने मेरी समस्या हल की - लेकिन फिर से धन्यवाद! :) – Hunsoul

+2

मैंने कोशिश की और यह बहुत अच्छा काम करता है। आशा है कि यह टिप्पणी दूसरों के लिए सहायक होगी। धन्यवाद जोश। – akjoshi

+1

यह पहली एकल क्लिक ईवेंट को बाधित नहीं करेगा, क्योंकि पहले क्लिक ईवेंट e.ClickCount = 1 के लिए। – Knasterbax

संबंधित मुद्दे