2010-01-29 2 views
4

Сценарий:(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

ответ

4

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

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

проверить эту статью: Override default styles Это может иметь то, что вы ищете.

+0

Спасибо, Джошуа, за ваш быстрый ответ! Статья интересна, но это не совсем касается моей проблемы. Я знаю, что мы можем «переопределить» стиль по умолчанию, но я хочу сохранить значение по умолчанию «FontSize» и сохранить его в ресурсе (типа «double»), чтобы его можно было использовать для вычисления относительного значения других двойных ресурсов (даже это, кажется, следующий вопрос!) – mg007

+0

Хм, хорошо, я мог подумать, что это изменить код для использования конвертера. Затем вы можете установить Control.FontSize в объект-конвертер, который оценивается на основе управления на основе управления. Взгляните на этот http://stackoverflow.com/questions/312044/wpf-pass-the-value-of-one-control-to-a-converter-to-set-the-width-on-another-co Это может быть альтернатива. Это не полностью в ресурсе, но может позволить вам сделать то, что вы пытаетесь сделать. –

+0

Вы имеете в виду, что я должен привязать каждое свойство шрифта элемента управления к 'SystemFonts.MessageFontSize' и конвертеру (предположим' FontSizeMapper'), который принимает параметры 'B',' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' и соответственно возвращает размер шрифта? Да, это вариант, но вам не кажется, что это будет немного легко, если я инкапсулирую его в стиле элементов управления (как упоминалось в моем вопросе * Примечание # 2 *) без использования 'BasedOn = {...}' ? – mg007

Смежные вопросы