【问题标题】:Split WPF Style XAML Files拆分 WPF 样式 XAML 文件
【发布时间】:2010-03-12 17:03:19
【问题描述】:

我见过的大多数 WPF 样式都被拆分为一个很长的 Theme.xaml 文件。为了便于阅读,我想拆分我的,所以我的 Theme.xaml 看起来像这样:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="/PresentationFramework.Aero;v3.0.0.0;31bf3856ad364e35;component/themes/aero.normalcolor.xaml"/>
        <ResourceDictionary Source="Controls/Brushes.xaml"/>
        <ResourceDictionary Source="Controls/Buttons.xaml"/>
        ...
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

问题是这个解决方案不起作用。我有一个默认按钮样式,它是基于按钮的默认 Aero 样式:

<Style x:Key="{x:Type Button}" TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type Button}}">
    <Setter Property="FontSize" Value="14"/>
    ...
</Style>

如果我将所有这些都放在一个文件中,它就可以工作,但是一旦我将它拆分,我就会得到 StackOverflow 异常,因为它认为它是 BasedOn 本身。有没有解决的办法? WPF在合并资源字典时如何添加资源?

【问题讨论】:

    标签: wpf xaml styles


    【解决方案1】:

    如果总是要同时应用这两种样式,为什么不更改较小样式(稍后被覆盖的样式)上的键?然后,您将通过该键而不是 {StaticResource {x:Type Button}} 引用后者。这应该可以解决确定基本类型的问题。它还可以解决以错误顺序应用样式的潜在问题(例如,如果您多次重新定义一个属性,则应用这些字典的顺序会导致不同的结果)。

    只要最终的后代样式具有正确的键,就应该正确地应用求和。

    【讨论】:

    • 我自己的自定义按钮样式适用于任何地方,我不想每次创建按钮时都明确设置按钮样式。我只想调整 PresentationFramework.Aero 中现有的默认按钮样式
    【解决方案2】:

    如果省略 BasedOn,哪些属性没有您期望的值?我注意到,当您想要覆盖一些属性时,您可以安全地省略 BasedOn,默认样式的模板仍然会被应用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-04
      • 1970-01-01
      • 2011-06-26
      • 2022-11-29
      • 2015-04-12
      • 1970-01-01
      相关资源
      最近更新 更多