2010-03-04 12 views
10

मैं WinXP पर एक WPF आवेदन लिख रहा हूँ और मैं इस तरह विस्टा विषय के साथ डिफ़ॉल्ट थीम अधिरोहित हैअवहेलना ओवरराइड WPF विषय

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

    var themerd = new ResourceDictionary(); 
    themerd.Source = new Uri(@"PresentationFramework.Aero;V3.0.0.0;31bf3856ad364e35;component\themes/aero.normalcolor.xaml", UriKind.Relative); 

    Resources.MergedDictionaries.Add(themerd); 
} 

और यह ज्यादातर ठीक काम करता है। जब मैं इस तरह के एक बटन के रूप में नियंत्रण का उपयोग करें:

<Button /> 

शैली ठीक लग रहा है, लेकिन अगर मैं इस तरह एक अलग शैली के साथ एक बटन का उपयोग करें:

<Button> 
    <Button.Style> 
    <Style TargetType="Button"> 
     <Setter Property="Width" Value="80" /> 
    </Style> 
    </Button.Style> 
</Button> 

शैली के साथ निर्दिष्ट विषय शैली को पार कर जाएगी इसके शीर्ष पर निर्माण के बजाय मानक WinXP शैली। यह मेरे लिए बेहद सीमित है। क्या इस मुद्दे से बचने का कोई तरीका है?

उत्तर

10

क्यों इस

डिफ़ॉल्ट basedon = एक शैली के लिए केवल वर्तमान विषय के संसाधन शब्दकोश का उपयोग कर से जेनरेट है हो रहा है। एक थीम को ओवरराइड करने के लिए जो तकनीक आप दिखाते हैं वह वास्तव में थीम डिक्शनरी को उपयोग में नहीं बदलती है: यह केवल थीम के संसाधन शब्दकोश से संसाधनों को संसाधन के संसाधन शब्दकोश में जोड़ती है। चूंकि वर्तमान थीम अपरिवर्तित है, डिफ़ॉल्ट आधारऑन भी अपरिवर्तित है।

हल करने के लिए कैसे यह

विकल्प 1: स्थानीय रूप से Win32 स्तर पर uxtheme.dll के लिए कॉल में अवरोध डालने के विषय ओवरराइड GetCurrentThemeName!। यह काफी जटिल है लेकिन आपके XAML में कोई बदलाव नहीं होने के साथ आपकी सभी शैलियों के लिए काम करता है।

विकल्प 2: कस्टम मार्कअप एक्सटेंशन का उपयोग करके सेट करें। यह इस तरह दिखेगा:

<Style TargetType="Button" BasedOn="{DefaultAeroStyle Button}"> ... 

आपका कस्टम MarkupExtension पहले उपयोग पर एयरो विषय शब्दकोश लोड और एक स्थिर क्षेत्र में संग्रहीत होता है। इसका कन्स्ट्रक्टर एक प्रकार लेगा, और इसके ProvideValue शैली खोजने के लिए शब्दकोश में टाइप देखेंगे।

विकल्प 3: एक मध्यवर्ती नामित शैली के आधार पर सेट करें। अपने निचले स्तर शब्दकोश में अब

<Application ...> 
    <Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="... theme path ..." /> 
     </ResourceDictionary.MergedDictionaries> 

     <Style x:Key="ThemeButtonStyle" TargetType="Button" BasedOn="{StaticResource {x:Type Button}}" /> 
     <Style x:Key="ThemeListBoxStyle" TargetType="ListBox" BasedOn="{StaticResource {x:Type ListBox}}" /> 
     ... 
    </ResourceDictionary> 
    </Application.Resources> 
</Application> 

आप कह सकते हैं:: यह इस प्रकार दिखाई देगा

<Style TargetType="Button" BasedOn="{StaticResource ThemeButtonStyle}" /> 

विकल्प 4: सेट basedon एक स्थिर संपत्ति और एक्स का उपयोग कर: स्टेटिक मार्कअप विस्तार

+1

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

+0

विकल्प 2 बहुत अच्छा है, कुछ हद तक यह गतिशील स्रोतों के आधार पर नहीं होने की समस्या के आसपास भी हो जाता है। –

+0

मैं आम तौर पर ग्राहक को समझाकर इस मुद्दे को हल करता हूं कि वर्तमान ओएस थीम के साथ रहना बेहतर है क्योंकि विंडोज़ अंतिम उपयोगकर्ता को "सामान्य" दिखाई देगी। हालांकि मैंने उन स्थितियों में विकल्प 2 और विकल्प 3 दोनों का उपयोग किया है जहां मुझे यूआई के एक अनुभाग को पुन: स्थापित करने की आवश्यकता है, लेकिन यूआई (जैसे पॉपअप) का एक आंतरिक भाग * नहीं * को पुनर्स्थापित किया जाना चाहिए। –

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