2009-02-20 10 views
41

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

ऐसी कार्रवाई का आह्वान करने का सही तरीका क्या है?

उत्तर

52

Close() सभी अप्रबंधित संसाधनों को जारी करता है, और सभी स्वामित्व वाले Window एस बंद करता है।

किसी भी अन्य प्रबंधित संसाधनों को आपको निर्धारित करने की आवश्यकता है Closed ईवेंट से संभाला जाना चाहिए।

Reference

(ध्यान दें: पिछले उत्तर हटा दिया गया है, यह एक पूरी तरह से गलत अनुमान था)

+1

डब्ल्यूपीएफ में विंडो क्लास में कोई निपटान नहीं है() विधि! –

+6

शायद मुझे पहले दस्तावेज़ों को पढ़ना चाहिए? –

11

बहुत कुछ WPF तत्वों है कि वास्तव में स्पष्ट रूप से, निपटारा करने के लिए Windows Forms के विपरीत की आवश्यकता है।

विंडो के मामले में, बंद() को कॉल करना documentation पर सभी प्रबंधित और अप्रबंधित संसाधनों को निपटाने के लिए पर्याप्त है।

+3

मेरे दस्तावेज़ों में कहा गया है कि केवल अप्रबंधित संसाधनों का निपटारा किया गया है ... –

1

खिड़की को बंद करना और आत्मविश्वास होना कि आपने इसे सभी संसाधन जारी किए हैं और इसके किसी भी बच्चे तर्क के पेड़ में कचरा इकट्ठा करने के लिए सभी अच्छे व्यवहार तत्वों का कारण बनेंगे।

मैं कहता हूं "अच्छी तरह से व्यवहार किया गया" क्योंकि यह सैद्धांतिक रूप से संभव है कि एक ऐसा तत्व हो जो ऐसा धागा बनाये जो ठीक से नहीं रोका गया हो, लेकिन व्यावहारिक रूप से यदि आप मूल WPF ढांचे और अच्छी तरह लिखित नियंत्रणों का उपयोग कर रहे हैं, तो आप बस सबकुछ छोड़ने के लिए ठीक होना चाहिए।

6

बस मामले में, मैं अपने दो सेंट जोड़ दूंगा।

मेरी समस्या यह थी कि मैंने पर्याप्त समस्या निवारण नहीं किया था। मेरे खिड़की, एक बच्चे विंडो खोला जा सकता था बंद कर दिया, और फिर से खोला, तो मैं यह पूरी तरह से बंद करने से रोकने के लिए निम्नलिखित कहा:

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { 
    e.Cancel = true; 
    this.Hide(); 
} 

हालांकि, जब Window.Close बुलाया गया था, यह केवल छुपाया खिड़की। मैं अंत में पर पकड़ लिया और निम्नलिखित कहा:

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { 
    e.Cancel = true; 
    this.Hide(); 
} 

public void Close() { 
    this.Closing -= Window_Closing; 
    //Add closing logic here. 
    base.Close(); 
} 

यह ठीक काम करता है - यह बंद किया जा रहा से खिड़की को रोकने ईवेंट हैंडलर निकाल देता है, और फिर इसे बंद कर देता है।

+0

हां, मुझे एक ही खिड़की बंद करने की कोशिश करते समय बिल्कुल वही बग मिला है (क्लोज-स्टॉपिंग इवेंट हैंडलर को अनसब्सक्राइब करना भूल गया है)। मेरा दिन बचाया :) – Nipheris

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