2010-03-04 103 views
10

我寫在WinXP一個WPF應用程序,我已重寫與Vista主題默認的主題是這樣的:覆蓋重寫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

爲什麼發生這種情況

默認支持算法FMP =的風格生成使用當前主題的資源字典。您爲重寫主題顯示的技術實際上並未改變正在使用的主題詞典:它只是將主題資源詞典中的資源添加到應用程序的資源詞典中。由於當前主題不變,默認的BasedOn也不變。

如何解決呢

方案1:通過攔截來電UXTHEME.DLL本地覆蓋主題GetCurrentThemeName在Win32的水平!這很複雜,但適用於所有樣式,而不更改您的XAML。

選項2:使用自定義MarkupExtension設置BasedOn。它應該是這樣的:

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

您的自定義的MarkupExtension將加載在第一次使用Aero主題字典並將其存儲在一個靜態字段。它的構造函數將採用Type,並且它的ProvideValue將在字典中查找類型以查找樣式。

選項3:將BasedOn設置爲中間命名樣式。它應該是這樣的:

<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}" /> 

方案四:使用一個靜態屬性和X組支持算法FMP:靜態標記擴展

+1

謝謝,你的回答非常有幫助。這個領域似乎缺乏WPF。你通常使用哪個選項來解決這個問題? – 2010-03-04 06:09:30

+0

選項2非常酷,在某種程度上,它甚至可以解決沒有使用BasedOn DynamicResources的問題。 – 2010-03-04 07:08:00

+0

我通常通過向客戶解釋,堅持使用當前操作系統主題來解決問題,因爲Windows對最終用戶看起來是「正常」的。然而,在我需要重新定義UI的一部分但用戶界面的內部部分(如Popup)* *不重新定義的情況下,我使用了選項2和選項3。 – 2010-03-04 14:48:23