基于不同 XAML 的样式继承

本文关键字:样式 继承 XAML 于不同 | 更新日期: 2023-09-27 18:32:46

如何将样式中的 BasedOn 标记指定为其他文件中定义的样式。

字典1.xaml定义

   <Style x:Key="basicStyle" TargetType="TextBlock" >
       <Setter Property="FontSize" Value="24"></Setter>
       <Setter Property="Foreground" Value="DarkGray"></Setter>
       <Setter Property="FontWeight" Value="Bold"></Setter>
    </Style>

在字典2.xaml中,我需要类似的东西

    <Style x:Key="headerStyle" TargetType="TextBlock" >
       <Setter Property="FontSize" Value="46"></Setter>
       <Setter Property="Foreground" Value="DarkGray"></Setter>
       <Setter Property="FontWeight" Value="Bold"></Setter>
    </Style>

如何实现这一点?

基于不同 XAML 的样式继承

简单的方法:

Dictionary2.xaml定义合并词典(紧跟在开始ResourceDictionary标记之后):

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="/Path/to/Dictionary1.xaml" />
</ResourceDictionary.MergedDictionaries>

然后

<Style x:Key="headerStyle" TargetType="TextBlock" BasedOn="{StaticResource basicStyle}" >
    .....
</Style>

这将解决问题,但与所有简单的解决方案一样,有一个问题:每次合并字典时,您都可以有效地创建合并字典的副本。它是递归的 - 如果你有Dict3.xaml和Dict4.xaml都加载Dictionary2.xaml,你将创建Dictionary1.xaml的三个实例。使用复杂的依赖结构,您可以达到应用程序启动时内存中有 19,000+ 个字典对象,内存占用量从 180MB 增加到 1200MB (TrueStory™ :()。

解决方案是SharedResourceDictionary。本教程中的实现应被视为一个起点,可能需要进行一定程度的调整 - 具体取决于使用场景。谷歌"wpf SharedResourceDictionary"的一些陷阱和解决方案。