如何在XAML中创建具有样式继承的主题

时间:2014-04-29 19:24:21

标签: wpf xaml

我创建了一个广泛使用样式的WPF应用程序,特别是样式继承(使用BasedOn)来描述它的外观。因此,在整个应用程序的主要文件(<Application.Resources><Control.Resources>)中,我定义了以下样式:

<Color x:Key="MusicTextColor">Red</Color>
<SolidColorBrush x:Key="MusicTextColorBrush" Color="{DynamicResource MusicTextColor}" />
<Style x:Key="MusicText" TargetType="TextBlock">
    <Setter Property="FontSize" Value="14" />
    <Setter Property="FontFamily" Value="Segoe UI" />
    <Setter Property="Foreground" Value="{DynamicResource MusicTextColorBrush}" />
</Style>
<Style x:Key="MusicTitle" BasedOn="{StaticResource MusicText}" TargetType="TextBlock">
    <Setter Property="FontWeight" Value="Bold" />
    <Setter Property="FontSize" Value="40" />
 </Style>

在UI中我会像这样使用主题内容:

<TextBlock Style="{DynamicResource MusicTitle}">Artist:</TextBlock>
<Rectangle Background="{DynamicResource MusicTextColorBrush}" />

现在主题应用程序,我在运行时加载一个包含<ResourceDictionary>主题更改的theme.xaml文件,并将其资源字典与应用程序资源合并。该文件可能例如包含以下内容,它应该改变所有&#34;音乐的颜色和字体。标签:

<ResourceDictionary ... >
    <Color x:Key="MusicTextColor">Green</Color>
    <Style x:Key="MusicText" TargetType="TextBlock">
        <Setter Property="FontSize" Value="14" />
        <Setter Property="FontFamily" Value="Consolas" />
        <Setter Property="Foreground" Value="{DynamicResource MusicTextColorBrush}" />
    </Style>
</ResourceDictionary>

问题是,这不起作用。无论是颜色变化还是字体变化都没有被拾取。请注意,如果我直接使用任何重新定义的样式(例如&#34; MusicText&#34;),而不是派生的样式,则实际更改了字体IS(这确认了资源合并发生)。解释很可能是BasedOn属性使用StaticResource绑定,因此即使在合并之后也不会找到重新定义的样式。据我所知,BasedOn不允许在此我需要DynamicResource绑定。

对我而言,这看起来像是一个常见的问题 - 在运行时使用样式继承的应用程序,但直到现在我还没有找到一个现实的解决方案。

当然我可以完全停止使用样式继承,但这会产生很多冗余代码。

此外,我可以将所有派生的样式复制到主题中,但这样会容易出错并阻止进一步的应用程序更新(无需每次更改都手动更新每个主题)。

我是否遗漏了某些内容,或者是否真的没有方便的解决方案?

0 个答案:

没有答案