2009-04-08 9 views
8

ठीक है, मैं इस बंद कह मुझे यकीन है कि यह जरूरी नहीं कि इस समस्या से निपटने के लिए सही रास्ता है नहीं कर रहा हूँ द्वारा लेकिन शुरू कर देना चाहिए ...एक Windows से दूसरे थ्रेड में एक WPF विंडो खोलने के फॉर्म अनुप्रयोग

मूल रूप से मेरे पास है मेरे आवेदन में अधिसूचनाओं को प्रदर्शित करने के लिए डब्ल्यूपीएफ में एक विंडो बनाई है (आउटलुक न्यू मेल अधिसूचना की तरह थोड़ा)। मैं इस विंडो को अपने स्वयं के थ्रेड में दिखाने और दिखाने की कोशिश करना चाहता हूं (यह भविष्य में कुछ काम कर सकता है)।

मैंने WPF का उपयोग करके विंडो बनाई है क्योंकि यह AlwaysOnTop और Fading In और Out जैसी चीज़ों को संभालने में थोड़ा अच्छा है।

एप्लिकेशन जो अधिसूचना दिखाता है वह 3.5 विंडोज फॉर्म ऐप है। मैंने एक अलग थ्रेड में एक फॉर्म दिखाने के लिए इस SOF: C# winforms startup (Splash) form not hiding के समान उदाहरण देखे हैं, हालांकि मैं WPF विंडो के साथ एक नया संदेश लूप शुरू करने में असमर्थ हूं।

मैंने अधिसूचना को कॉल करने का प्रयास किया है। शो() एक नए धागे में हालांकि विंडो कभी प्रदर्शित नहीं होती है।

  1. क्या यह WPF अपने स्वयं के धागे में दिखाना संभव है?

  2. मुझे कुछ संसाधन क्यों कहते हैं कि आपको किसी भी यूआई को अलग थ्रेड में नहीं दिखाना चाहिए?

उत्तर

15

WPF Threading Model इस पर विवरण है। "एकाधिक विंडोज़, एकाधिक थ्रेड" की तलाश करें।

मूल रूप से, आप एक नया धागा है, जो प्रासंगिक विंडो बनाता शुरू हुई और फिर आदेश, उस खिड़की के लिए एक डिस्पैचर को चलाने के लिए नया थ्रेड पर कॉल

System.Windows.Threading.Dispatcher.Run(); 

+1

धन्यवाद, यह लाइन: System.Windows.Threading.Dispatcher.Run() मेरा फॉर्म थ्रेड में दिखाता है। अभी तक इसे पूरी तरह से समझ में नहीं आता है लेकिन लेख मुझे एक दिशा देता है, धन्यवाद। दिलचस्प बात यह है कि लेख अलग-अलग धागे पर यूआई फॉर्म बनाने के लिए पूरी तरह से उचित है। – MrEdmundo

+0

+1 'Dipatcher.run' को कॉल नहीं कर रहा था, मेरी समस्या भी थी, इसके बिना मेरी नई विंडो फ्लैश हो जाएगी और जल्दी गायब हो जाएगी। – Drahcir

+0

इसके साथ किए जाने पर आप इस नए यूआई थ्रेड को कैसे नष्ट कर देंगे? –

0

आपको मुख्य यूआई थ्रेड का उपयोग करके अधिसूचना प्रदर्शित करनी चाहिए और यदि वह विंडो कोई काम करने जा रही है, तो उस काम को पृष्ठभूमि थ्रेड में चलाएं। यूआई ऑब्जेक्ट्स तक पहुंचने या बनाने के लिए आपको एक से अधिक धागे का उपयोग नहीं करना चाहिए, भले ही आप उन वस्तुओं को धागे के बीच साझा न करें।

+0

पर्याप्त मेला, लेकिन क्यों?मेरा मतलब है कि क्यों है, मुझे एक से अधिक धागे में यूआई ऑब्जेक्ट्स क्यों नहीं बनाना चाहिए? मैं चाहता हूं कि यह विंडो उपयोगकर्ताओं को वर्तमान काम को प्रभावित किए बिना लोड और प्रदर्शित करे – MrEdmundo

3
  1. क्या यह WPF अपने स्वयं के धागे में दिखाना संभव है?

बिल्कुल। बस एक नया एसटीए थ्रेड बनाएं और इसे अपने Window बनाएं और प्रदर्शित करें। मैंने इस तकनीक का उपयोग स्प्लैश स्क्रीन के लिए किया है क्योंकि मुख्य (यूआई) थ्रेड वास्तव में अन्य चीजों को करने के लिए बंधे हुए हैं। यह मेरे नियंत्रण से पूरी तरह से बाहर था कि यूआई थ्रेड पर एक तीसरे पक्ष के ढांचे के कारण हम कितना काम कर रहे थे।

  1. मुझे कुछ संसाधन क्यों कहते हैं कि आपको किसी भी यूआई को एक अलग थ्रेड में नहीं दिखाना चाहिए?

शायद अतिरिक्त जटिलता शामिल होने के कारण। यदि आपके Window एस में से कोई एक दूसरे को डेटा पास करना चाहता है, तो आपको याद रखना होगा कि वे अलग-अलग धागे पर निष्पादित कर रहे हैं। इसलिए, प्रत्येक को अपने प्रेषक का उपयोग सही धागे पर मार्शल कॉल करने के लिए करना चाहिए।

+0

हाय, मैंने एसटीए थ्रेड में नई विंडो की कोशिश की है, हालांकि जब मैं अधिसूचना कहता हूं। दिखाएं() कुछ भी प्रदर्शित नहीं होता है। – MrEdmundo

+1

आपको न्यूनतम कोड को सरल और पोस्ट करने की आवश्यकता हो सकती है। धागा शुरू करना भूलना कुछ आसान हो सकता है;) –

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