2010-03-17 11 views
5

में सही WPF डिस्पैचर हो रही एक वस्तु के निर्माता में मैं एक WPF MediaElement वस्तु बनाने के लिए की जरूरत है:एक धागा

m_videoMedia = new MediaElement(); 

लेकिन वर्ग भी एक अन्य धागे से instantiated जा सकती है, तो मैं

उपयोग करने की आवश्यकता
Dispatcher.Invoke(DispatcherPriority.Normal, 
    (Action)(() => { m_videoMedia = new MediaElement(); })); 

लेकिन यह कैसे मुझे लगता है कि निर्माता में सही डिस्पैचर उदाहरण प्राप्त कर सकते हैं: रों

उत्तर

8

आप सबसे अधिक संभावना सिर्फ Dispatcher.CurrentDispatcher .Invoke ...

01 उपयोग कर सकते हैं

हालांकि, अगर किसी कारण से काम नहीं करता है, तो आप अपने कन्स्ट्रक्टर के हिस्से के रूप में डिस्पैचर का संदर्भ प्राप्त कर सकते हैं। निर्माण समय पर यूआई थ्रेड से बस Dispatcher.CurrentDispatcher में पास करें।

+8

msdn के अनुसार यह वर्तमान धागे से जुड़े प्रेषक को वापस कर देगा और एक नया निर्माण करेगा जो पहले से ही नहीं बनाया गया है। यह ऐसा कुछ नहीं है जो आप इस मामले में करना चाहते हैं। आपको यूआई से जुड़े प्रेषक की आवश्यकता होगी। या अधिक विशेष रूप से एक विशिष्ट विंडो के प्रेषक। वर्तमान प्रेषक के संदर्भ को पारित करने के लिए –

+0

+1। – Nate

+0

स्थैतिक डिस्पैचर। वर्तमान डिस्पैचर ने इसी तरह के परिदृश्य में मेरे लिए काम नहीं किया। मैंने आवेदन की कोशिश की। वर्तमान। डिस्पैचर जैसा कि sinelaw द्वारा सुझाया गया - यह काम किया। –

2

अधिकांश WPF नियंत्रण DispatcherObject से प्राप्त होते हैं जिसमें आपके पास आवश्यक डिस्पैचर संपत्ति होती है। तो मूल रूप से आप प्रेषक का उपयोग उस नियंत्रण से करेंगे जिसका आप उपयोग करना चाहते हैं। इस मामले में, उदाहरण के लिए, विंडो जहां MediaElement को जोड़ा गया है।

-1

यदि आप अपनी परियोजना में System.Windows.Forms पर संदर्भ जोड़ते हैं, तो आप WPF में Application.DoEvents() का उपयोग जारी रख सकते हैं।

5

As explained in this answer:

आप स्थिर आवेदन उदाहरण से यूआई डिस्पैचर हड़पने कर सकते हैं:, Application.Current.Dispatcher

आप पहले अशक्त के लिए Application.Current देखना चाहें के रूप में यह बंद अनुक्रम के दौरान मंजूरी दे दी हो सकता है ।

भी, आवेदन कक्षा के लिए here are the docs