2010-07-21 5 views
19

जब मैं विंडो या नियंत्रण पहली बार प्रदर्शित होता हूं तो मैं कुछ कोड चलाने के लिए चाहता हूं। मैं लोडेड का उपयोग नहीं कर सकता क्योंकि यह एक से अधिक बार आग लग सकता है। मैं प्रारंभिक उपयोग नहीं कर सकता क्योंकि यह कन्स्ट्रक्टर द्वारा किया जाता है।डब्ल्यूपीएफ: आरंभिक और लोड की गई घटना के बीच क्या है?

क्या कोई घटना कहीं बीच है?

उत्तर

29

दुर्भाग्य से ऐसी कोई घटना नहीं है। करने के लिए वैकल्पिक रूप से

http://msdn.microsoft.com/en-us/library/ms748948.aspx#Window_Lifetime_Events

alt text http://i.msdn.microsoft.com/dynimg/IC155674.png

+6

वैसे यह बेवकूफ है, मुझे इस तरह के गार्ड क्लॉज का उपयोग नहीं करना चाहिए। लेकिन यह सही जवाब है इसलिए आपका मुद्दा यहां है। –

+1

सहमत - आप खिड़की से विरासत में अपना खुद का खिड़की वर्ग बना सकते हैं और यदि आप अक्सर ऐसा करते हैं तो अपनी पूरी परियोजना में एक ईवेंट लागू कर सकते हैं। – brendan

+2

कृपया यह भी देखें: http://blogs.msdn.com/b/mikehillberg/archive/2006/09/19/loadedvsinitialized.aspx –

5

:

if(!IsSetUp) 
{ 
    MySetUpFunction(); 
    IsSetUp = true; 
} 

बाहर चेक WPF विंडोज जीवन भर की घटनाओं यहाँ - आप अपना सामान केवल एक बार आग सुनिश्चित करने के लिए भरी हुई विधि में एक बूलियन उपयोग कर सकते हैं एक बुलियन ध्वज संग्रहित करते हुए, आप एक विस्तार विधि का उपयोग कर सकते हैं और फर्जी Loaded पर केवल एक बार फायरिंग के लिए रैपिंग का प्रतिनिधि बना सकते हैं।

public static void OnLoadedOnce(
    this UserControl control, 
    RoutedEventHandler onLoaded) 
{ 
    if (control == null || onLoaded == null) 
    { 
     throw new ArgumentNullException(); 
    } 

    RoutedEventHandler wrappedOnLoaded = null; 
    wrappedOnLoaded = delegate(object sender, RoutedEventArgs e) 
    { 
     control.Loaded -= wrappedOnLoaded; 
     onLoaded(sender, e); 
    }; 
    control.Loaded += wrappedOnLoaded; 
} 

... 

class MyControl : UserControl 
{ 
    public MyControl() 
    { 
     InitializeComponent(); 
     this.OnLoadedOnce(this.OnControlLoaded /* or delegate {...} */); 
    } 

    private void OnControlLoaded(object sender, RoutedEventArgs e) 
    { 
    } 
} 
संबंधित मुद्दे