Сценарий:(WPF) Как установить значение sys: Double to 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
. (Если это будет сделано, я могу использовать конвертер as described here, чтобы получить BigFontSize
и SmallFontSize
относительно NormalFontSize
)
Clue:
Я нашел в документации, что размер шрифта по умолчанию хранится в статическом свойстве (двойной) 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
Спасибо, Джошуа, за ваш быстрый ответ! Статья интересна, но это не совсем касается моей проблемы. Я знаю, что мы можем «переопределить» стиль по умолчанию, но я хочу сохранить значение по умолчанию «FontSize» и сохранить его в ресурсе (типа «double»), чтобы его можно было использовать для вычисления относительного значения других двойных ресурсов (даже это, кажется, следующий вопрос!) – mg007
Хм, хорошо, я мог подумать, что это изменить код для использования конвертера. Затем вы можете установить Control.FontSize в объект-конвертер, который оценивается на основе управления на основе управления. Взгляните на этот http://stackoverflow.com/questions/312044/wpf-pass-the-value-of-one-control-to-a-converter-to-set-the-width-on-another-co Это может быть альтернатива. Это не полностью в ресурсе, но может позволить вам сделать то, что вы пытаетесь сделать. –
Вы имеете в виду, что я должен привязать каждое свойство шрифта элемента управления к 'SystemFonts.MessageFontSize' и конвертеру (предположим' FontSizeMapper'), который принимает параметры 'B',' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' и соответственно возвращает размер шрифта? Да, это вариант, но вам не кажется, что это будет немного легко, если я инкапсулирую его в стиле элементов управления (как упоминалось в моем вопросе * Примечание # 2 *) без использования 'BasedOn = {...}' ? – mg007