2009-05-10 11 views
10

डब्ल्यूपीएफ एक नियंत्रण पुस्तकालय को विभिन्न सिस्टम विषयों के लिए विभिन्न संसाधन शब्दकोश प्रदान करने की अनुमति देता है, अनिवार्य रूप से एक एप्लिकेशन को ऑपरेटिंग सिस्टम के चयनित दृश्य थीम (एयरो, लुना इत्यादि) से मेल खाने की इजाजत देता है।क्या WPF विषयों का उपयोग किसी अनुप्रयोग के लिए एकाधिक स्किन्स को शामिल करने के लिए किया जा सकता है जिसे रनटाइम पर बदला जा सकता है?

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

उत्तर

11

यहां कोड का एक स्निपेट है जिसका उपयोग मैंने अपने एप्लिकेशन में किया था जो थीमिंग का समर्थन करता था। इस उदाहरण में, मेरे पास दो थीम हैं (डिफ़ॉल्ट और क्लासिक एक्सपी)। विषय संसाधन डिफ़ॉल्टथीम.एक्सएमएल और क्लासिकथीम.एक्सएमएल क्रमशः संग्रहीत हैं।

यह App.xaml मैं विषय बदलने के लिए अनुमति देने के लिए निम्न विधि है पीछे कोड में तब मेरे App.xaml

<Application ...> 
    <Application.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="ArtworkResources.xaml" /> 
       <ResourceDictionary Source="DefaultTheme.xaml" /> 
      </ResourceDictionary.MergedDictionaries> 

      <Style x:Key="SwooshButton" TargetType="ButtonBase"> 
       <!-- style setters --> 
      </Style> 

      <!-- more global styles --> 
     </ResourceDictionary> 
    </Application.Resources> 
</Application> 

में डिफ़ॉल्ट कोड है। असल में, आप जो करते हैं वह संसाधन शब्दकोश साफ़ करता है और फिर नई थीम के साथ शब्दकोश को पुनः लोड करता है।

private Themes _currentTheme = Themes.Default; 
    public Themes CurrentTheme 
    { 
     get { return _currentTheme; } 
     set { _currentTheme = value; } 
    } 

    public void ChangeTheme(Themes theme) 
    { 
     if (theme != _currentTheme) 
     { 
      _currentTheme = theme; 
      switch (theme) 
      { 
       default: 
       case Themes.Default: 
        this.Resources.MergedDictionaries.Clear(); 
        AddResourceDictionary("ArtworkResources.xaml"); 
        AddResourceDictionary("DefaultTheme.xaml"); 
        break; 
       case Themes.Classic: 
        this.Resources.MergedDictionaries.Clear(); 
        AddResourceDictionary("ArtworkResources.xaml"); 
        AddResourceDictionary("ClassicTheme.xaml"); 
        break; 
      } 
     } 
    } 

    void AddResourceDictionary(string source) 
    { 
     ResourceDictionary resourceDictionary = Application.LoadComponent(new Uri(source, UriKind.Relative)) as ResourceDictionary; 
     this.Resources.MergedDictionaries.Add(resourceDictionary); 
    } 

क्या आप भी इस दृष्टिकोण के साथ ध्यान में रखने की आवश्यकता होगी कि किसी भी शैली है कि एक विषय का उपयोग एक गतिशील संसाधन की आवश्यकता होगी है। उदाहरण के लिए:

<Window Background="{DynamicResource AppBackgroundColor}" /> 
+0

शानदार उत्तर, मैंने इसे कार्यान्वित किया है, मैं सोच रहा था कि आप बाध्य बटन छवियों को बदलने के लिए इसका उपयोग कैसे करेंगे। मैंने यहां एक प्रश्न पूछा है: http://stackoverflow.com/questions/39795317/how-do-i- गतिशील रूप से-change-which-resource-folder-i-get-an-image-from – AidanO

3

मुझे ढांचे में ऐसा करने का कोई तरीका नहीं पता है, लेकिन यदि आप अपने नियंत्रण को बदलने वाले हर नियंत्रण को शैलीबद्ध करते हैं तो आप इसे कर सकते हैं।

सिद्धांत शैली को DynamicResource बनाने और फिर विभिन्न शैली के लिए उपयोगकर्ता कॉन्फ़िगरेशन के आधार पर ResourcesDictionary लोड करना है।

Here एक ऐसा लेख है जिसमें एक उदाहरण है।

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

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