(WPF) Как установить значение sys: Double для SystemFonts.MessageFontSize из ResourceDictionary? - PullRequest
4 голосов
/ 29 января 2010

Сценарий:

Я хочу использовать 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 ]

4 голосов
/ 04 февраля 2010

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

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>

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

0 голосов
/ 29 января 2010

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

...