2009-03-16 10 views
7

मुझे लगता है कि एक विधि Window_Loaded() जो XAML के द्वारा कहा जाता है बनाता है एक कोड उदाहरण देखा "विंडो लोड" घटना:XAML विंडो द्वारा कॉल की गई विधि में कोड क्यों चलाएं। लोड किया गया?

<Window x:Class="TestModuleLoader.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300" Loaded="Window_Loaded"> 
    <Grid> 
     ... 
    </Grid> 
</Window> 

लेकिन कोड में पीछे, कोड दोनों निर्माता और Window_Loaded() विधि में काम किया:

using System.Windows; 

namespace TestModuleLoader 
{ 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 
     } 

     private void Window_Loaded(object sender, RoutedEventArgs e) 
     { 
      //what advantages do I have running code here? 
     } 
    } 
} 

क्या ऐसा करने के कोई फायदे हैं?

क्या एएसपी.नेट में एक "विंडो लोड साइकिल" है, यहां पर जाने के लिए उपयोगी है, यानी PreRender(), PostRender(), आदि जैसी विधियों के बारे में जानना उपयोगी है?

उत्तर

12

हां, एएसपी.NET की तरह, WPF नियंत्रणों के लिए एक समान जीवन चक्र है। हालांकि WPF नियंत्रणों का जीवन चक्र सरल है, क्योंकि यह मूल रूप से आरंभिक, लोड और अनलोडेड ईवेंट (उस क्रम में) की सहमति देता है। देखें:

http://msdn.microsoft.com/en-us/library/ms754221.aspx

और माइक Hillberg एक उत्कृष्ट लेख initalized और भरी हुई घटनाओं के बीच अंतर का प्रदर्शन किया है:

http://blogs.msdn.com/mikehillberg/archive/2006/09/19/LoadedVsInitialized.aspx

+0

माइक हिलबर्ग अपने ब्लॉग में कहते हैं, "यदि आप सुनिश्चित नहीं हैं कि कौन सी घटना का उपयोग करना है, और आप अब और नहीं पढ़ना चाहते हैं, तो लोडेड ईवेंट का उपयोग करें"। बढ़िया, मैं फिलहाल डब्ल्यूपीएफ के साथ थोड़ा अधिभार महसूस कर रहा हूं और मुझे अभी यह जानने की जरूरत है। लिंक के लिए धन्यवाद! –

+0

डब्ल्यूपीएफ थोड़ा जबरदस्त महसूस कर सकता है। मैं व्यक्तिगत रूप से महसूस करता हूं कि मैंने केवल हिमशैल की नोक देखी है। – Razzie

3

बहुत बढ़िया लिंक, रेज़ी।

एडवर्ड - आपको पता चलेगा कि सबसे इंटरस्टेस्टिंग भेद यह है कि नियंत्रक हमेशा आपकी विंडो/पेज/उपयोगकर्ता नियंत्रण पर पहली विधि के रूप में बुलाया जाता है और आप अपने अंतिम मूल्यों में प्रारंभ होने वाली सभी निर्भरता प्रॉपर्टीज पर भरोसा नहीं कर सकते हैं। साथ ही, यह बीमार है कि आपके कन्स्ट्रक्टर के भीतर से किसी वर्चुअल विधियों को कॉल करने की सलाह दी जाए।

लोडेड इवेंट, इसके विपरीत, प्रारंभिक प्रक्रियाओं के अंत में आम तौर पर कहा जाता है ... वह है - जब विंडो/पेज/उपयोगकर्ता नियंत्रण पूरी तरह से एक WPF ElementTree में लोड हो गया है। आपके लोड किए गए ईवेंट के भीतर से, आप किसी भी तरीके से आत्मविश्वास से कॉल कर सकते हैं और अप्रत्याशित परिणामों के जोखिम के बिना किसी भी निर्भरता प्रॉपर्टी को संशोधित कर सकते हैं।

एक अच्छा पैटर्न (जिसे मैं वर्तमान में अपने प्रोजेक्ट में उपयोग कर रहा हूं) लोड किए गए ईवेंट में कस्टम निर्भरता गुणों को प्रारंभ करना है यदि प्रारंभिकरण के दौरान उन्हें संशोधित नहीं किया गया है। नियंत्रणों के लिए, यह पैटर्न आपको "महंगे" गुणों (जैसे निर्भरता प्रॉपर्टी जो एक पर्यवेक्षण योग्यता है) शुरू करने से बचने की अनुमति देता है यदि उन्हें ओवरराइट किया जा रहा है (यानी एक कॉलिंग कोड से बाध्यकारी संपत्ति)।

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

+0

अच्छा सारांश :-) – Razzie