2015-06-04 5 views
9

नहीं कहा गया है मेरे पास विशिष्ट नियंत्रण पर WPF behavior है। जब मैं उस विंडो को बंद करता हूं जो नियंत्रण रखता है OnDetaching फ़ंक्शन को कॉल नहीं किया जाता है।व्यवहार के ऑनडेटिंग फ़ंक्शन को

व्यवहार मौजूद है (घटनाओं के कारण यह पंजीकृत है), हालांकि खिड़की अब मौजूद नहीं है (स्मृति रिसाव)।

OnDetaching फ़ंक्शन को **** क्यों नहीं निकाल दिया गया है, और मैं इसे कैसे हल कर सकता हूं?

protected override void OnAttached() 
{ 
    base.OnAttached(); 

    this.AssociatedObject.MouseLeftButtonDown += AssociatedObject_PlotAreaMouseLeftButtonDown; 
    this.AssociatedObject.MouseLeftButtonUp += AssociatedObject_PlotAreaMouseLeftButtonUp; 
    this.AssociatedObject.MouseMove += AssociatedObject_PlotAreaMouseMove; 
} 

protected override void OnDetaching() 
{ 
    base.OnDetaching(); 

    this.AssociatedObject.MouseLeftButtonDown -= AssociatedObject_PlotAreaMouseLeftButtonDown; 
    this.AssociatedObject.MouseLeftButtonUp -= AssociatedObject_PlotAreaMouseLeftButtonUp; 
    this.AssociatedObject.MouseMove -= AssociatedObject_PlotAreaMouseMove; 
} 

उत्तर

9

OnAttached कहा जाता है जब XAML पार्सर XAML पार्स करके एक व्यवहार है कि लक्ष्य के नियंत्रण से BehaviorCollection जो DependencyAttached संपत्ति के रूप में सामने आ रहा है करने के लिए कहते हैं का एक उदाहरण बनाता है।

हालांकि जब दृश्य का निपटारा किया जाता है, तो संग्रह (व्यवहार संग्रह) का निपटान किया गया था, यह कभी ऑनडेटिंग विधि को ट्रिगर नहीं करेगा।

यदि व्यवहार ठीक से साफ नहीं है तो यह जीसी द्वारा एकत्र नहीं किया जाएगा और उस संग्रह में व्यवहार चयन और अन्य व्यवहार भी आयोजित करेगा। व्यवहार एसोसिएटेड ऑब्जेक्ट को विस्तारित करने के लिए डिज़ाइन किए गए हैं, जब तक आप एसोसिएटेड ऑब्जेक्ट इवेंट्स की सदस्यता ले रहे हों, क्योंकि एसोसिएटेड ऑब्जेक्ट (प्रकाशक) मर जाएगा और आपका व्यवहार कचरा कलेक्टर द्वारा एकत्र किया जाएगा।

A good source


एक वैकल्पिक विंडो के (जब कोई उपयोगकर्ता ऊपरी दाहिने 'एक्स' बटन पर क्लिक करता) "समापन" घटना को संभालने के लिए है, और वहाँ OnDetaching

<i:Interaction.Triggers> 
     <i:EventTrigger EventName="Closing"> 
      <cmd:EventToCommand Command="{Binding CloseCommand}" /> 
     </i:EventTrigger> 
</i:Interaction.Triggers> 

फिर देखें निर्माता में हैंडलर सहयोगी:

MyWindow() 
{ 
    // Set up ViewModel, assign to DataContext etc. 
    Closing += viewModel.OnWindowClosing; 
} 

और ViewModel करने के लिए हैंडलर जोड़ने: AssociatedObject.Unloaded घटना के लिए और eventHander अंदर सदस्यता के लिए

public void OnWindowClosing(object sender, CancelEventArgs e) 
{ 
    // Cancel, OnDetaching, etc 
} 
+0

यदि यह उत्तर कृपया ऊपर उठाने में मदद करता है तो आपका सचमुच 'अच्छा जवाब' बैज जीत जाएगा :) –

2

कोशिश सभी माउस घटनाओं की सदस्यता रद्द करें। व्यवहार ऑनडेटिंग() func। हमेशा "समय" पर नहीं बुलाया जाता है।

+0

ध्यान दें कि यदि आइटम दृश्य पेड़ पर पुन: उत्पन्न होता है, तो आपका व्यवहार अब और काम नहीं करेगा; – Rune

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