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

StackOverflow https://stackoverflow.com/questions/2161960

Вопрос

Сценарий:

Я хочу использовать 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} что невозможно (я думаю)

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

ТЕГИ :WPF SystemFonts.MessageFontSize ResourceDictionary FontSize BasedOn DynamicResource

Это было полезно?

Решение

Я сделал вот так...

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>

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top