2008-10-02 8 views
14

मैं इस XAML करने की कोशिश की:WPF: स्लाइडर उठाना नहीं करता है MouseLeftButtonDown या MouseLeftButtonUp

<Slider Width="250" Height="25" Minimum="0" Maximum="1" MouseLeftButtonDown="slider_MouseLeftButtonDown" MouseLeftButtonUp="slider_MouseLeftButtonUp" /> 

और यह सी #:

private void slider_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
sliderMouseDown = true; 
} 

private void slider_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
{ 
sliderMouseDown = false; 
} 

sliderMouseDown चर कभी नहीं बदलता क्योंकि MouseLeftButtonDown और MouseLeftButtonUp घटनाओं उठाया कभी नहीं कर रहे हैं। मैं इस कोड को काम करने के लिए कैसे प्राप्त कर सकता हूं जब उपयोगकर्ता के पास बाएं मान बटन को सही करने के लिए स्लाइडर पर बाएं माउस बटन नीचे होता है, और जब माउस ऊपर होता है, तो बूल गलत पर सेट होता है?

उत्तर

14

स्लाइडर माउसडाउन ईवेंट (बटन के समान) निगलते हैं।

आप पूर्वावलोकनमाउसडाउन और पूर्वावलोकनमोउसअप ईवेंट के लिए पंजीकरण कर सकते हैं जिन्हें स्लाइडर को संभालने का मौका मिलने से पहले निकाल दिया जाता है।

+0

धन्यवाद, मैं IsMouseCapturedWithinChanged ईवेंट का उपयोग अपने अंतिम लक्ष्य को पूरा करने के लिए previewMouseLeftButtonUp ईवेंट के साथ संयोजन में करने में सक्षम था। – Nick

+0

क्या कोई इस व्यवहार के लिए तर्क को जानता है? – PeterAllenWebb

+0

इस व्यवहार का कारण यह है कि बटन माउसडाउन ईवेंट को संभालता है। डिफ़ॉल्ट रूप से यदि कोई नियंत्रण कहता है कि उन्होंने एक ईवेंट संभाला है, तो किसी और को अधिसूचना नहीं मिल जाती है जब तक कि उन्होंने निर्दिष्ट नहीं किया है कि वे हैंडल की घटनाओं को भी देखना चाहते हैं। –

16

यह (और शायद बेहतर अपने परिदृश्य के आधार पर) करने के लिए एक और तरीका है निम्नलिखित की तरह प्रक्रियात्मक कोड में कोई ईवेंट हैंडलर रजिस्टर करने के लिए है:

this.AddHandler 
(
    Slider.MouseLeftButtonDownEvent, 
    new MouseButtonEventHandler(slider_MouseLeftButtonDown), 
    true 
); 

सच तर्क कृपया ध्यान दें। यह मूल रूप से कहता है कि आप उस घटना को प्राप्त करना चाहते हैं भले ही इसे संभाला गया हो। दुर्भाग्य से, इस तरह के एक ईवेंट हैंडलर को जोड़ना केवल प्रक्रियात्मक कोड से किया जा सकता है, न कि xaml से।

दूसरे शब्दों में, इस विधि के साथ, आप पूर्वावलोकन ईवेंट के बजाय सामान्य घटना (जो बुलबुले) के लिए एक ईवेंट हैंडलर पंजीकृत कर सकते हैं जो सुरंग (और इसलिए अलग-अलग समय पर होते हैं)।

अधिक जानकारी के लिए WPF अनलेश के पृष्ठ 70 पर डिगिंग डीप साइडबार देखें।

+1

इस चाल का उपयोग करना हैक की तरह लगता है जो भविष्य में आपकी नौकरी (या किसी और के) को अधिक कठिन बना सकता है। क्या यह वास्तव में एक अच्छा विचार है? – PeterAllenWebb

+0

मैं इसे एक हैक नहीं कहूंगा। हालांकि, यह कहा जा रहा है कि, यदि संभव हो तो मैं इसका उपयोग करने से बचने की कोशिश करूंगा, लेकिन यदि आप चट्टान और कठिन जगह के बीच हैं ... मुझे समझाएं। नियमित घटनाओं से पहले पूर्वावलोकन घटनाएं आग लगती हैं। तो, पूर्वावलोकन घटनाओं का उपयोग करना हमेशा स्थिति में काम नहीं कर सकता है। – cplotts

+0

यह "केवल" तरीका है कि हम अपने एमएफसी आवेदन के भीतर डब्ल्यूपीएफ काम कर सकते हैं। एप्लिकेशन के भीतर हमारे संदेश के साथ पूर्वावलोकन घटनाओं गड़बड़। –

1

मैं यह उल्लेख करना चाहता हूं कि स्लाइडर पूरे माउसडाउन ईवेंट को निगल नहीं देता है। टिक टिक पर क्लिक करके, आप ईवेंट के लिए अधिसूचित हो सकते हैं। स्लाइडर माउसडाउन घटनाओं को तब तक संभाल नहीं लेगा जब तक वे स्लाइडर के ... स्लाइडर से नहीं आते।

मूल रूप से आप टिक के साथ चालू

AddHandler(Slider.MouseLeftButtonDownEvent, ..., true) 

संस्करण का उपयोग करने, सुनिश्चित करें कि घटना पहले से संचालित किया गया हो तय है। यदि आप नहीं करते हैं तो आप किनारे के मामले के साथ समाप्त हो जाएंगे जहां आपने सोचा था कि स्लाइडर पर क्लिक किया गया था, लेकिन यह वास्तव में एक टिक था। पूर्वावलोकन ईवेंट के लिए पंजीकरण करना और भी बदतर है - आप कहीं भी इवेंट ले लेंगे, यहां तक ​​कि टिकों के बीच सफेद-स्थान पर भी।

4

LostMouseCapture और GotMouseCapture का उपयोग करने का प्रयास करें।

private void sliderr_LostMouseCapture(object sender, MouseEventArgs e) 

    private void slider_GotMouseCapture(object sender, MouseEventArgs e) 

GotMouseCapture पर सक्रिय होता है उपयोगकर्ता स्लाइडर, और LostMouseCapture खींच जब वह यह विज्ञप्ति शुरू होता है।

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