Til*_*lak 13 .net c# wpf xaml resourcedictionary
如何将样式中的BasedOn标记指定为某些其他文件中定义的样式.
例,
Dictionary1.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>
Run Code Online (Sandbox Code Playgroud)
在Dictionary2.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>
Run Code Online (Sandbox Code Playgroud)
怎么做到这一点?
XAM*_*eLi 16
简单的方法:
在Dictionary2.xaml定义MergedDictionaries(在开始ResourceDictionary标记之后):
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/Path/to/Dictionary1.xaml" />
</ResourceDictionary.MergedDictionaries>
Run Code Online (Sandbox Code Playgroud)
然后
<Style x:Key="headerStyle" TargetType="TextBlock" BasedOn="{StaticResource basicStyle}" >
.....
</Style>
Run Code Online (Sandbox Code Playgroud)
这将解决问题,但与所有简单的解决方案一样,有一个问题:每次合并字典时,您都可以有效地创建合并字典的副本.并且它是递归的 - 如果你有Dict3.xaml和Dict4.xaml都加载Dictionary2.xaml,你将创建三个Dictionary1.xaml实例.使用复杂的依赖结构,您可以在应用程序启动时在内存中拥有19,000多个字典对象,内存占用空间从180MB到1200MB(TrueStory™:().
解决方案是SharedResourceDictionary.本教程中的实现应视为一个起点,可能需要进行一定程度的调整 - 具体取决于使用场景.谷歌"wpf SharedResourceDictionary"的一些陷阱和解决方案.