我创建了一个广泛使用样式的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
绑定。
对我而言,这看起来像是一个常见的问题 - 在运行时使用样式继承的应用程序,但直到现在我还没有找到一个现实的解决方案。
当然我可以完全停止使用样式继承,但这会产生很多冗余代码。
此外,我可以将所有派生的样式复制到主题中,但这样会容易出错并阻止进一步的应用程序更新(无需每次更改都手动更新每个主题)。
我是否遗漏了某些内容,或者是否真的没有方便的解决方案?