2010-08-06 11 views
28

WPF में टैब आधारित वातावरण को लागू करने के लिए हमें टैब आधारित वातावरण को पूरा करने के लिए हमारे WPF फॉर्म को उपयोगकर्ता नियंत्रण में परिवर्तित करने की आवश्यकता है, हालांकि ऐसा करने पर, उपयोगकर्ता नियंत्रण के loaded event को two times कहा जाता है।एक WPF उपयोगकर्ता नियंत्रण आग की लोड की गई घटना दो बार

इंटरनेट पर खोज करते समय अन्य लोगों ने भी इस मुद्दे को इंगित किया। हम कैसे सुनिश्चित कर सकते हैं कि लोड की गई घटना को केवल एक बार कहा जाता है, क्योंकि जब इसे कई बार नियंत्रण के प्रारंभिकरण कहा जाता है तो कई बार होता है।

धन्यवाद

+0

मैंने इसे एक खाली .NET 4.0 WPF एप्लिकेशन में पुन: उत्पन्न करने का प्रयास किया और लोडेड ईवेंट केवल एक बार निकाल दिया गया। क्या आपने लोड स्टैक को देखने की कोशिश की है कि यह देखने के लिए कि क्या लोड हो रहा है, इससे पहले .NET Framework में कुछ अजीब चल रहा है? –

+0

अपने उपयोगकर्ता नियंत्रण को एक टैब नियंत्रण में रखें, और आप टैब स्विच करते समय समस्या को पुन: उत्पन्न करने में सक्षम होंगे। – Eternal21

उत्तर

36

के रूप में इस blog में बताया गया है, लोडेड घटना निकाल दिया जाता है जब कभी भी एक नियंत्रण प्रस्तुत किया जा रहा है (यानी दृश्य पेड़ में जोड़ा गया)।

कई नियंत्रण हैं जो आपके नियंत्रण को कई बार लोड/अनलोड किए जाने का कारण बनेंगे। उदाहरण के लिए, मूल WPF TabControl केवल चयनित टैब की सामग्री प्रस्तुत करता है। तो जब आप एक नया टैब चुनते हैं, तो पहले चयनित टैब की सामग्री अनलोड हो जाती है। यदि आप पहले चयनित टैब पर वापस क्लिक करते हैं, तो इसकी सामग्री पुनः लोड हो जाती है।

एक काम आसपास बुलियन का उपयोग करने के लिए है कि आप पहले से ही अपना नियंत्रण शुरू कर चुके हैं, जैसा कि दूसरों द्वारा सुझाया गया है। वैकल्पिक रूप से, आप इसके बजाय Initialized ईवेंट का उपयोग करने में सक्षम हो सकते हैं।

+0

मैं कई टैब बांधने के लिए टैबकंट्रोल के 'आइटमसोर्स' का उपयोग कर रहा हूं और टैब दृश्यों में व्यूमोडेल को बांधने के लिए 'डेटा टेम्पलेट' का उपयोग कर रहा हूं। मेरे मामले में, न केवल 'लोडेड' घटना को निकाल दिया गया है बल्कि टैब व्यू के ** कन्स्ट्रक्टर ** को फिर से बुलाया जाता है। ऐसा लगता है कि प्रत्येक बार जब मैं टैब स्विच करता हूं तो WPF पूरी तरह से मेरा टैब नियंत्रण फिर से बना रहा है। – Felix

2

घटना में स्थापित एक loaded झंडा, और, यदि झंडा पहले से ही स्थापित किया गया है, कुछ भी नहीं करते।

+0

आपके सुझाव के लिए धन्यवाद, क्या यह वाकई एक असली मुद्दा है और टैब –

-3

वास्तव में, वहाँ पहले से ही एक IsLoaded संपत्ति है, इसलिए आप लोड ईवेंट हैंडलर की शुरुआत करने के लिए इस लाइन जोड़ सकते हैं:

If Me.IsLoaded Then Return 
+2

के कारण दो बार बुलाया गया ईवेंट कभी भी दिमाग में नहीं है, यह काम नहीं करता है। आपको अपनी संपत्ति का उपयोग करना होगा। –

+7

चीजों को साफ रखने के लिए आपको अपना जवाब हटाना चाहिए। – DuckMaestro

+1

लोड किए गए ईवेंट हैंडलर में, जाहिर है, IsLoaded संपत्ति हमेशा सत्य है। – Pejman

11

आपका रूटेड इवेंट हैंडलर Loaded हुक से स्वयं को पहले की तरह से हटा सकता है (और चाहिए)।

public class MyClass : Window 
{ 
    public MyClass() 
    { 
     Loaded += MyLoadedRoutedEventHandler; 
    } 

    void MyLoadedRoutedEventHandler(Object sender, RoutedEventArgs e) 
    { 
     Loaded -= MyLoadedRoutedEventHandler; 
     /// ... 
    } 
}; 
संबंधित मुद्दे