(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>
Я не знаю, является ли это "хорошей практикой" или нет (пожалуйста, прокомментируйте это), я только знаю, что это работает..!!!
Проверьте эту статью: Переопределить стили по умолчанию. Может иметь то, что вы ищете.