(WPF) Как установить значение sys:Double для SystemFonts.MessageFontSize из ResourceDictionary?

Сценарий:

Я хочу использовать 3 стандартных размера шрифта для своего приложения WPF: 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, (Если это сделано, я могу использовать конвертер, как описано здесь, чтобы получить 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'.

Замечания:

  • Я не хочу делать это из кода, например, из App(). (Возможно ли иметь код-позади для ResourceDictionary?)
  • Я не хочу инкапсулировать это в обобщенном стиле, из которого могут быть получены другие стили (используя BasedOn) потому что у меня есть несколько ресурсных словарей, и использовать их будет невозможно DynamicResource с BasedOn
    То есть я не могу использовать

    <Style x:Key="BigFont" TargetType="{x:Type Control}"}>
        <Setter Property="Control.FontSize" 
                Value="{Binding Source={x:Static SystemFonts.MessageFontSize},
                                Converter={ . . . }" />
    </Style>
    

    Потому что, если у меня есть стиль в другом ResourceDictionary, скажем, HeaderTextBlockStyleтогда бы мне пришлось использовать BasedOn={DynamicResource BigFont} что невозможно (я думаю)

Любая помощь будет принята с благодарностью.
Спасибо.

TAGS: WPF SystemFonts.MessageFontSize ResourceDictionary FontSize BasedOn DynamicResource

2 ответа

Решение

Я так и сделал...

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>

Я не знаю, является ли это "хорошей практикой" или нет (пожалуйста, прокомментируйте это), я только знаю, что это работает..!!!

Проверьте эту статью: Переопределить стили по умолчанию. Может иметь то, что вы ищете.

Другие вопросы по тегам