2011-10-04 11 views
9

मुझे एहसास हुआ कि किसी EventTrigger से जुड़े InvokeCommandAcction का उपयोग करते समय, मूल ईवेंट अभी भी पैरेंट तत्वों तक पहुंच रहा है जब तक इसे संभाला नहीं जाता है। खैर, मुझे लगता है कि यह एक अपेक्षित व्यवहार है। लेकिन मेरा सवाल यह है कि मैं ईवेंट को कैसे संभाला जा सकता हूं ताकि यह पूरे यूआई पेड़ के माध्यम से फैल न सके?InvokeCommandAction को घटनाओं को पैरेंट तत्वों से प्रचारित करने से कैसे रोकें?

दरअसल, जैसा कि आप इस घटना को कमांड में संभालते हैं, सब कुछ इस आदेश में संभाला जाएगा, इसलिए इसे प्रसारित करने की आवश्यकता नहीं है। और एक कोने के मामले में मैंने पाया, यह कुछ अवांछित व्यवहार का कारण बनता है। उदाहरण के लिए, जब कोई उपयोगकर्ता तत्व को डबल क्लिक करता है तो मैं एक नई विंडो खोलता हूं (MouseDoubleClick ईवेंट)। समस्या यह है कि नई खिड़कियां खुलती हैं और फिर मुख्य विंडो वापस एक के सामने आती है क्योंकि माउसडब्लूक्लिक घटना यूआई पेड़ में शीर्ष तत्व तक पहुंच जाती है। वांछित व्यवहार नई खिड़की को सामने रखना होगा, लेकिन InvokeCommandAction ईवेंट को प्रसारित करने देता है, मुख्य विंडो फोकस वापस ले जाती है ...

मैं क्या कर सकता हूं इसके बजाय CallMethodAction परिसंपत्ति का उपयोग करना है, लेकिन जैसा कि मैं एक एमवीवीएम परिदृश्य में हूं, मैं अपने कोड में यूआई इवेंट तर्क नहीं चाहता हूं। भले ही यह मुझे घटना को निश्चित रूप से चिह्नित करने और इस मुद्दे को ठीक करने के लिए चिह्नित करे।

<UserControl x:Class="..." 
      xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="MouseDoubleClick"> 
      <i:InvokeCommandAction Command="{Binding Path=DisplayReportCommand}"/> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
    ... 
</UserControl> 

उत्तर

17

आप अपनी खुद की EventTrigger कि घटनाओं के रूप में संभाला के निशान को लागू कर सकते हैं।

public class HandlingEventTrigger : System.Windows.Interactivity.EventTrigger 
{ 
    protected override void OnEvent(System.EventArgs eventArgs) 
    { 
     var routedEventArgs = eventArgs as RoutedEventArgs; 
     if (routedEventArgs != null) 
      routedEventArgs.Handled = true; 

     base.OnEvent(eventArgs); 
    } 
} 

फिर <local:HandlingEventTrigger EventName="MouseDoubleClick"> साथ <i:EventTrigger EventName="MouseDoubleClick"> की जगह और अपने usercontrol के गुण को

xmlns:local="clr-namespace:HandlingEventTrigger's namespace here" 

जोड़ें।

+0

यह एक बहुत अच्छा विचार प्रतीत होता है। मैं और अधिक उत्तरों के लिए इंतजार करूँगा। धन्यवाद। – Ucodia

+1

मैंने इस जवाब को देखा क्योंकि यह एक स्वच्छ समाधान है जिसे मैं एक एमवीवीएम परिदृश्य में उपयोग कर सकता हूं। – Ucodia

+1

विंडोज फोन के लिए, RoutedEventArgs के बजाय GestureEventArgs का उपयोग करें। –

1

आशा उपयोगकर्ता नियंत्रण

   CommandManager.PreviewCanExecute="PreviewCanExecute" 

करने और ईवेंट हैंडलर में

   e.ContinueRouting = false; 

जोड़ें जुड़ी घटना इस help होगा!

+0

ठीक है धन्यवाद। मैं इसे आज़माउंगा। – Ucodia

0

MouseDoubleClick Event वास्तव में एक बुलबुले रूटेड घटना नहीं बल्कि प्रत्यक्ष मार्ग वाली घटना है।

हालांकि, यह घटना तत्व पेड़ के साथ उठाई गई है, जिसे Snoop उपकरण के साथ चेक किया जा सकता है। इसके अलावा, यहां तक ​​कि यदि MouseDoubleClick के लिए हैंडल किया गया है, तो यह ईवेंट तत्व पेड़ के साथ होगा।

हालांकि यह रूटेड इवेंट (माउसडब्लूक्लिक इवेंट) एक तत्व पेड़ के माध्यम से एक बुलबुले मार्ग का पालन करता प्रतीत होता है, यह वास्तव में एक प्रत्यक्ष मार्ग वाली घटना है जो प्रत्येक UIElement द्वारा तत्व पेड़ के साथ उठाया जाता है।

यदि आप हैंडलड प्रॉपर्टी को माउसडब्लॉकक्लिक इवेंट हैंडलर में सत्य पर सेट करते हैं, तो रूट के साथ बाद में माउसडब्लूक्लिक घटनाएं हैंडल सेट को झूठी पर सेट की जाएंगी। यह नियंत्रण उपभोक्ताओं के लिए एक उच्च स्तरीय घटना है जो उपयोगकर्ता को नियंत्रण में डबल-क्लिक करने और किसी एप्लिकेशन में ईवेंट को संभालने के लिए अधिसूचित करना चाहते हैं। (MSDN से)

उपरोक्त के रूप में, आपकी समस्या का प्रचार आपके द्वारा किए गए प्रचार के कारण नहीं हो सकता है। विंडो है। शो सक्रिय संपत्ति, जो निर्धारित करती है कि पहली बार दिखाए जाने पर विंडो सक्रिय होती है या नहीं।आप संपत्ति को उप-विंडो (xaml) में नीचे सेट कर सकते हैं लेकिन कृपया ध्यान दें कि यद्यपि शोएक्टिवेट मुख्य विंडो पर फ़ोकस दे सकता है, लेकिन यह मुख्य विंडो दृश्यमान रूप से उप विंडो के सामने नहीं रख सकता है। मैंने समाधान खोजने की कोशिश की है लेकिन अब तक कोई जानकारी नहीं है।

<Window ShowActivated="False" ....> 
.... 
</Window> 
संबंधित मुद्दे