2010-02-18 8 views
5

मैं WPF के साथ प्रयोग कर रहा हूं और अपने पुराने भूलभुलैया स्क्रीनसेवर को फिर से कार्यान्वित कर रहा हूं।बच्चों को कॉल करने के लिए पर्याप्त। नए जोड़ने से पहले पुराने नियंत्रण से छुटकारा पाने के लिए एक WPF कैनवास पर साफ़ करें?

मेरा कोड मूल रूप से कैनवास में छवियों का एक गुच्छा जोड़ता है, पूरे कैनवास को कवर करने के लिए एक ग्रिड, 64x64 पिक्सेल छवियों को एक साथ बना देता है। फिर मैं भूलभुलैया में आंदोलन को "एनिमेट" करता हूं, जिसे अनुवाद परिवर्तन को समायोजित करके और छवियों को स्वैप करके, चारों ओर भूलभुलैया को स्क्रॉल करना होता है।

हालांकि, ऐसा लगता है कि मेरे पास कुछ प्रकार का रिसाव है। जब भी मैं खिड़की का आकार बदलता हूं, तो मैं फिर से फॉर्म को कवर करने के लिए छवि घटकों को फिर से बनाना चाहता हूं, या तो अधिक या कम छवियों के साथ।

अगर मैं तंग हलकों में चारों ओर प्रपत्र के निचले बाएँ कोने खींचें पुनर्निर्माण हिस्सा धीमी और धीमी हो जाता है।

_Canvas.Children.Clear(); 

यह पर्याप्त है:

पुराना नियंत्रण मैं बस ऐसा किया निकालने के लिए? मंदी के कारण मुझे लगता है कि यह नहीं है।

हालांकि, बाद से उलझन नहीं वर्तमान में "अवतार" द्वारा "खोजा" है, भूलभुलैया छवियों 25% अस्पष्टता के साथ तैयार कर रहे हैं, और मुझे लगता है कि अगर मैं उन्हें हटाने में विफल रहा है, मैं शीर्ष पर कई छवियों मिलेगा एक-दूसरे के, लेकिन ऐसा लगता है कि यह भी नहीं है।

मैं छवि सूत्रों कैशिंग कर रहा हूँ, छवि घटकों इस तरह बनाए जाते हैं:

_Images = new Image[(int)width, (int)height]; 
for (int x = -1; x < width - 1; x++) 
{ 
    for (int y = -1; y < height - 1; y++) 
    { 
     Image i = new Image(); 
     i.Width = 64; 
     i.Height = 64; 
     i.Source = _Outside; 
     Canvas.SetLeft(i, x * 64); 
     Canvas.SetTop(i, y * 64); 
     _Canvas.Children.Add(i); 
     _Images[x + 1, y + 1] = i; 
    } 
} 

बाद में वे सौंपा रहे हैं इस तरह दिखाने के लिए चित्र:

Maze.Square sq = _Maze[_TopLeftMazeX + x, _TopLeftMazeY + y]; 
Image img = _Images[x + 1, y + 1]; 

if (sq.Seen) 
    img.Opacity = 1.0; 
else 
    img.Opacity = 0.25; 
switch (sq.Type) 
{ 
    case Maze.SquareType.Hallway: 
     img.Source = _Hallway; 
     break; 

    case Maze.SquareType.Wall: 
     img.Source = _Wall; 
     break; 

    case Maze.SquareType.Outside: 
     img.Source = _Outside; 
     break; 
} 

और क्या मैं के लिए दिखना चाहिए ? क्या किसी भी तरह से छवि घटकों का निपटान करने की आवश्यकता है?

उत्तर

6

कॉलिंग _Canvas.Children.Clear(); इसलिए कोई लीक देखते हैं, दृश्य पेड़ से छवियों के सभी संदर्भ निकाल देंगे। आप पुरानी छवि संदर्भ के लिए जाँच करने के लिए चाहते हो सकता है _Images में आयोजित किया जा रहा, या कुछ अन्य संग्रह आप को बनाए रखने हो सकता है। उदाहरण के लिए, आप ने कहा कि आप छवि सूत्रों कैशिंग थे - अकुशलता से ऐसा करने के लिए, या निश्चित रूप से आपके सिस्टम को प्रभावित करेगा बासी छवियों की बढ़ती सूची को बनाए रखने।

+0

_Images क्षेत्र सिर्फ एक सरणी, हर बार जब मैं नियंत्रण के पुनर्निर्माण को फिर से बनाया जाता है, और बाद कार्यक्रम उन्हें एक बार लोड होने के सूत्रों पुनः लोड नहीं कर रहे हैं, इसलिए मेरे लिए यह उन दोनों में से किसी होना प्रतीत नहीं होता है कि अपराधी हो सकता है। लेकिन इसे साफ़ करने के लिए धन्यवाद। पुराने नियंत्रण से छुटकारा पाने के लिए वास्तव में पर्याप्त है। यह कम से कम वह हिस्सा नहीं है। –