2010-03-04 121 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