(WPF) 如何从 ResourceDictionary 将 sys:Double 的值设置为 SystemFonts.MessageFontSize?

mg0*_*007 4 wpf font-size resourcedictionary dynamicresource

设想:

我想用3个标准字体大小为我的WPF应用程序:BigFontSizeNormalFontSize,和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>
Run Code Online (Sandbox Code Playgroud)

这很好用。但是我随机选择了 14 个作为正常尺寸。我想要的是获得系统定义的字体大小NormalFontSize。(如果这样做了,我可以使用此处描述的转换器来获取BigFontSizeSmallFontSize相对于NormalFontSize


线索:

我从文档中发现默认字体大小存储在静态属性 (double) 中SystemFonts.MessageFontSize。但是我应该怎么做才能将该值检索到资源字典中?(我知道BindingDynamicResource不能适用。但是,嘿,这是一个静态值,所以我怎么能申请StaticResourcex:Static或什么?)

我试过了

<sys:Double x:Key="XXXFontSize">
    <StaticResource ResourceKey="SystemFonts.MessageFontSize" />
</sys:Double>
Run Code Online (Sandbox Code Playgroud)

<sys:Double x:Key="XXXFontSize">
    <x:Static ResourceKey="SystemFonts.MessageFontSize" />
</sys:Double>
Run Code Online (Sandbox Code Playgroud)

两者似乎都不起作用(如预期)。我收到一条错误消息Cannot add content to object of type 'System.Double'.

笔记:

  • 我不想从代码中执行此操作,例如从 App() 中执行此操作。(是否可以为 ResourceDictionary 设置代码隐藏?)
  • 我不想将其封装在可以从中派生出其他样式的通用样式中(使用BasedOn),因为我有多个资源字典,并且无法使用DynamicResourcewithBasedOn
    也就是说,我不能使用

    <Style x:Key="BigFont" TargetType="{x:Type Control}"}>
        <Setter Property="Control.FontSize" 
                Value="{Binding Source={x:Static SystemFonts.MessageFontSize},
                                Converter={ . . . }" />
    </Style>
    
    Run Code Online (Sandbox Code Playgroud)

    因为,如果我在其他 ResourceDictionary 中有一个样式,比如说HeaderTextBlockStyle,那么我将不得不使用BasedOn={DynamicResource BigFont}这是不可能的(我认为)

任何帮助将不胜感激。
谢谢你。

标签:WPF SystemFonts.MessageFontSize ResourceDictionary FontSize BasedOn DynamicResource

mg0*_*007 5

我做过这样的...

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

......它就像一个奇迹一样工作!!!我可以在同一个(部分)资源字典或像这样的其他资源字典中使用这些资源......

<Style ...>
    <Setter Property="FontSize"
            Value="{DynamicResource MediumFontSize}" />

    ...

</Style>
Run Code Online (Sandbox Code Playgroud)

我不知道这是否是“好的做法”(请对此发表评论),我只知道它有效..!!!