情景:
我想为我的WPF应用程序使用3种标准字体大小:BigFontSize
,NormalFontSize
和SmallFontSize
。这些是双精度值,它们在资源字典中定义为(其中sys
已正确定义):
<sys:Double x:Key="BigFontSize">18</sys:Double>
<sys:Double x:Key="NormalFontSize">14</sys:Double>
<sys:Double x:Key="SmallFontSize">12</sys:Double>
这很有效。但我随机选择了14作为正常尺寸。我想要的是获得NormalFontSize
的系统定义字体大小。 (如果已经完成,我可以使用转换器as described here来获取BigFontSize
和SmallFontSize
相对于NormalFontSize
)
线索:
我从文档中发现默认字体大小存储在静态属性(double)SystemFonts.MessageFontSize
中。但是,如何将该值检索到资源字典呢? (我知道Binding
或DynamicResource
无法应用。但是,嘿,这是一个静态值,那么我如何应用StaticResource
或x:Static
或其他什么?)
我试过了
<sys:Double x:Key="XXXFontSize">
<StaticResource ResourceKey="SystemFonts.MessageFontSize" />
</sys:Double>
和
<sys:Double x:Key="XXXFontSize">
<x:Static ResourceKey="SystemFonts.MessageFontSize" />
</sys:Double>
两者似乎都不起作用(如预期的那样)。我收到错误Cannot add content to object of type 'System.Double'.
注意:
我不想将其封装在可以派生其他样式的通用样式中(使用BasedOn
),因为我有几个资源字典,并且不可能使用{{ 1}}与DynamicResource
也就是说,我不能使用
BasedOn
因为,如果我在其他ResourceDictionary中有一个样式,比如<Style x:Key="BigFont" TargetType="{x:Type Control}"}>
<Setter Property="Control.FontSize"
Value="{Binding Source={x:Static SystemFonts.MessageFontSize},
Converter={ . . . }" />
</Style>
,那么我将不得不使用HeaderTextBlockStyle
这是不可能的(我认为)
非常感谢任何帮助 谢谢。
TAGS :WPF SystemFonts.MessageFontSize ResourceDictionary FontSize BasedOn DynamicResource
答案 0 :(得分:4)
我这样做了......
public partial class GlobalResources : ResourceDictionary
{
public GlobalResources()
{
this.Add("GiantFontSize", SystemFonts.MessageFontSize * 2.5);
this.Add("BigFontSize", SystemFonts.MessageFontSize * 1.5);
this.Add("MediumFontSize", SystemFonts.MessageFontSize * 1.25);
this.Add("NormalFontSize", SystemFonts.MessageFontSize);
this.Add("SmallFontSize", SystemFonts.MessageFontSize * 0.85);
}
}
......它的工作就像奇迹!我可以在相同(部分)资源字典中使用这些资源,或者从这样的其他资源字典中使用这些资源......
<Style ...>
<Setter Property="FontSize"
Value="{DynamicResource MediumFontSize}" />
...
</Style>
我不知道这是不是“好习惯”(请对此发表评论),我只知道它有效.. !!!
答案 1 :(得分:0)
查看这篇文章:Override default styles它可能有你想要的东西。