2009-04-07 9 views
5

में होस्ट किए जाने पर गतिशील नहीं होते हैं, मैं WinForms कंटेनर में एक WPF UserControl होस्ट कर रहा हूं। अब, मैं UserControl विषय/त्वचा करने में सक्षम होना चाहता हूँ। ऐसा करने के लिए, मेरे पास कई संसाधन शब्दकोश हैं जो "खाल" को परिभाषित करते हैं। जब मेरा ऐप शुरू होता है तो मैं एक "नई प्रणाली। Windows.Aplication()" बना देता हूं ताकि अनुप्रयोग। वर्तमान मौजूद हो। थीम को बदलने के लिए पुरानी त्वचा हटा दी जाती है और रनटाइम पर एप्लिकेशन स्तर संसाधन शब्दकोश में एक नई त्वचा विलय हो जाती है। हालांकि, यह UserControl में किसी भी डायनामिक संदर्भित संसाधनों को नहीं बदलता है। मैंने इसे सीधे WPF एप्लिकेशन में करने की कोशिश की और यह ठीक काम किया। क्या मुझे कुछ याद आ रहा है, या ऐसा करना संभव नहीं है? वैसे, अगर मैं UserControl प्रारंभ करने से पहले एप्लिकेशन संसाधनों में एक त्वचा जोड़ता हूं तो यह काम करेगा लेकिन मैं इसके बाद त्वचा को नहीं बदल सकता।डायनामिक एप्लिकेशन-स्तरीय संसाधन डायनेमहोस्ट

सबसे बुनियादी तरीके से इस रेपो के लिए:

एक नया WinForms आवेदन बनाएँ। ऐप में एक WPF UserControl जोड़ें। यह काफी सरल है:

<UserControl ...> 
    <Grid> 
     <Button 
     Background="{DynamicResource ButtonBG}"/> 
    </Grid> 
</UserControl> 

दो ResourceDictionaries, White.xaml और Black.xaml (या जो भी) संबंधित रंग के साथ कुंजी ButtonBG के साथ एक SolidColorBrush है बनाएँ। फॉर्म 1.cs में, दो बटन और एलिमेंटहोस्ट जोड़ें। ElementHost के बच्चे को UserControl के उदाहरण के लिए सेट करें जिसे हमने अभी बनाया है। तार अप घटनाओं के लिए बटन है कि त्वचा स्वैप:

private void White_Click(object sender, EventArgs e) 
{ 
    Application.Current.Resources.MergedDictionaries[0] = 
     (ResourceDictionary)Application.LoadComponent(
     new Uri(@"\WpfThemes;component\White.xaml", UriKind.Relative))); 
} 

private void Black_Click(object sender, EventArgs e) 
{ 
    Application.Current.Resources.MergedDictionaries[0] = 
     (ResourceDictionary)Application.LoadComponent(
     new Uri(@"\WpfThemes;component\Black.xaml", UriKind.Relative))); 
} 

Program.cs में, यह सुनिश्चित करें कि Application.Current मौजूद है और प्रारंभिक त्वचा सेट:

[STAThread] 
static void Main() 
{ 
    new System.Windows.Application(); 

    Application.Current.Resources.MergedDictionaries[0] = 
     (ResourceDictionary)Application.LoadComponent(
     new Uri(@"\WpfThemes;component\White.xaml", UriKind.Relative))); 

    ... 
} 

अब, जब व्हाइट बटन क्लिक किया मैं उम्मीद करता हूं कि UserControl में बटन सफेद हो जाएगा और जब ब्लैक बटन क्लिक किया जाता है तो मैं बटन को काला करने की अपेक्षा करता हूं। ऐसा नहीं होता है, हालांकि।

क्या किसी को पता है क्यों? क्या कोई समाधान है?

संपादित करें: आइडिया: शायद, यदि विषय बदलते समय डायनेमिक स्रोतों के पुनर्मूल्यांकन को बल देने का कोई तरीका है, तो यह काम करेगा।

धन्यवाद, डस्टी

उत्तर

6

मैं इस WPF ढांचे में एक अनदेखी मुद्दा हो सकता है लगता है।

मैं क्या परावर्तक के माध्यम से बता सकते हैं, ऐसा लगता है जब Application संसाधन शब्दकोश भयंकर रूप (एक बदलाव की संभावना विस्तृत जोड़कर, निकालकर, या एक त्वचा की जगह की तरह प्रभाव लेकर गया होगा) बदल गया है, वहाँ कोड उस पर लूप है कि आवेदन में Windows के सभी और उन्हें अपने DynamicResources का पुनः मूल्यांकन करने के लिए मजबूर करता है। हालांकि, अन्य तत्व जो मैं पर शीर्ष-स्तर पर विचार करता हूं जैसे ElementHost एस को एक ही उपचार नहीं मिलता है। यह उस व्यवहार को जन्म देता है जिसे मैं अनुभव कर रहा हूं।

इस समस्या का मेरा कामकाज मैन्युअल रूप से मेरे सभी ElementHost एस से गुजरना है और ResourceDictionary फ़ाइल को जोड़ें, हटाएं या बदलें। यह सही नहीं है, लेकिन यह काम पूरा हो जाता है।

+0

हैलो डस्टबर्बवेल, क्या आप कृपया एक नमूना कोड प्रदान कर सकते हैं? – user1912383

-1

एक और कामकाज एक डमी विंडो बनाने और सामग्री के रूप में तत्व की सामग्री निर्दिष्ट करने के लिए होगा। यदि आप एप्लिकेशन को देखते हैं और यह जांचते हैं कि यह पुनर्वित्त के परिवर्तनों को कैसे प्रबंधित करता है, तो आप देखते हैं कि यह केवल विंडोज़ को सूचित करता है ..

केवल एक चीज जो आपको याद दिलाना चाहिए वह कभी भी खिड़की (-> अपवाद) नहीं दिखाना है, और तत्वहोस्ट का निपटान करते समय इसे बंद करना है, इसलिए एप्लिकेशन ठीक से बंद हो सकता है।

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