2012-04-15 13 views
15

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

हालांकि मैं मेनविंडो कन्स्ट्रक्टर कहां से बाहर नहीं आ सकता हूं। वैकल्पिक रूप से मैंने मेनविंडो के सदस्य फ़ंक्शन के माध्यम से ऑब्जेक्ट को पारित करने का प्रयास किया, लेकिन app.MainWindownullapp.Run() से पहले कहा जाता है। app.Run() के बाद कोड को समाप्त होने तक कोड वापस नहीं आता है।

एक और सकारात्मक स्थिति ऑब्जेक्ट को स्थिर वर्ग में संग्रहीत करेगी और मेनविंडो का उपयोग उस पर होगा, लेकिन यह अनावश्यक रूप से जटिल लगता है।

मुझे एहसास है कि मैं केवल मेनविंडो कन्स्ट्रक्टर में ऑब्जेक्ट बना सकता हूं, लेकिन इसका मतलब यह होगा कि वहां बहुत सारे कोड भी शामिल हैं, जो कि पूरे मुख्य समारोह में काफी कुछ है।

मैं इस वस्तु को अपने मेनविंडो में कैसे पास कर सकता हूं? या मेनविंडो कन्स्ट्रक्टर पूरे कार्यक्रम के लिए 'मुख्य' के रूप में कार्य करने का इरादा रखता है?

उत्तर

23

आप इसे ऐसा कर सकते हैं।

पहले App.xaml में जाएं और WP12 को स्वचालित रूप से MainWindow दिखाए जाने से रोकने के लिए इस लाइन को StartupUri="MainWindow.xaml" पर हटा दें।

अगला दाएं App.xaml पर क्लिक करें और खोलने के लिए View Code चुनें। इस फ़ाइल के अंदर हमें OnStartup ईवेंट ओवरराइड करने की आवश्यकता है।

protected override void OnStartup(StartupEventArgs e) 
{ 
    base.OnStartup(e); 
} 

OnStartup अंदर हम तो हमारे MainWindow का दृष्टांत और यह दिखा सकते हैं।

protected override void OnStartup(StartupEventArgs e) 
{ 
    base.OnStartup(e); 

    MainWindow mw = new MainWindow(); 
    mw.Show(); 
} 

और अब हम एक वैकल्पिक Constructor है कि हम और अधिक जानकारी पर पारित करने के लिए उपयोग कर सकते हैं लोड करने के लिए इस का उपयोग कर सकते हैं।

App.xaml.cs

protected override void OnStartup(StartupEventArgs e) 
{ 
    base.OnStartup(e); 

    MainWindow mw = new MainWindow(5); 
    mw.Show(); 
} 

MainWindow.xaml.cs

public MainWindow() 
{ 
    InitializeComponent(); 
} 

public MainWindow(int number) : base() 
{ 

} 

मैं अपने constructorschain करना पसंद करते हैं, लेकिन यह निश्चित रूप से किसी भी तरह से एक आवश्यकता नहीं है।

+0

धन्यवाद, यह एक आकर्षण की तरह काम करता है। फिर भी इसका मतलब है कि 'ऑनस्टार्टअप' फ़ंक्शन काफी 'मुख्य' है, जब तक कि आप 'स्टार्टअपइवर्ट्स' को उपclass न करें और वहां 'मुख्य' से आपको जो भी चाहिए उसे रखें।मुझे लगता है कि यह वास्तव में कोई फर्क नहीं पड़ता, मैं बस सी ++ के लिए उपयोग किया जाता है। –

2

आप ऑब्जेक्ट को XAML में घोषित करके मेनविंडो के डेटा कॉन्टेक्स्ट के रूप में सेट कर सकते हैं। (उदाहरण के लिए, यदि आप व्यूमोडेल बनाने की कोशिश कर रहे हैं)। इसके अलावा, डब्ल्यूपीएफ इस तरह का उदाहरण बनायेगा जिस पर आप नियंत्रण नहीं कर सकते। विंडो बनाने और प्रदर्शित करने के लिए आप ऐप क्लास में अपना कोड डाल सकते हैं, और App.xaml से StartupUri को हटा सकते हैं।

+0

'डेटाकॉन्टेक्स्ट' का उपयोग करना डब्ल्यूपीएफ में जाने का तरीका है, खासकर यदि आप बाद में 'एमवीवीएम' जैसे अधिक उन्नत पैटर्न का उपयोग करना चाहते हैं। – eandersson

+0

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

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