(WPF) Как установить значение sys:Double для SystemFonts.MessageFontSize из ResourceDictionary?
-
23-09-2019 - |
Вопрос
Сценарий:
Я хочу использовать 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>
Я не знаю, является ли это «хорошей практикой» или нет (пожалуйста, прокомментируйте это), я только знаю, что это работает..!!!
Другие советы
Ознакомьтесь с этой статьей: Переопределить стили по умолчанию Возможно, там есть то, что вы ищете.