Как задать размер шрифта в pt, если мы используем StaticResource или DynamicResource?

#wpf

#wpf

Вопрос:

в настоящее время я использую ресурс размера шрифта как

  <sys:Double x:Key="FontSize13">13</sys:Double>
<sys:Double x:Key="FontSize12">12</sys:Double>
<sys:Double x:Key="FontSize11">11</sys:Double>
  

и используя как

         <Setter Property="FontSize"
            Value="{DynamicResource FontSize13}" />
  

Как установить размер шрифта в точке, например 10pt, вместо пикселя?

Ответ №1:

Преобразование типа происходит во время компиляции компилятором XAML и, в частности, в ответ на FontSizeConverter присутствие для FontSize свойства, поэтому у нас есть основная проблема с запуском конвертера. Но мы можем создать вспомогательный модуль разметки для выполнения этой работы.

Вот как выглядит XAML:

 <Grid>
    <Grid.Resources>
        <local:FontSize Size="20" x:Key="TwentyPixels"/>
        <local:FontSize Size="11pt" x:Key="ElevenPoint"/>
    </Grid.Resources>
    <StackPanel>
        <TextBlock Text="Sample text" FontSize="{StaticResource TwentyPixels}"/>
        <TextBlock Text="Sample text" FontSize="{StaticResource ElevenPoint}"/>
    </StackPanel>
</Grid>
  

и вот расширение разметки:

 public class FontSizeExtension : MarkupExtension
{
    [TypeConverter(typeof(FontSizeConverter))]
    public double Size { get; set; }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return Size;
    }
}
  

Комментарии:

1. без расширения нет способа сделать это в самом ресурсе XAML?

2. Я пытался придумать способ, но не смог. Вы можете делать ужасные вещи, например, определять текстовый блок в статических ресурсах с размером шрифта, а затем ссылаться на этот размер шрифта, но это не то, что вы хотите.

3. Спасибо за метод расширения. Отлично

Ответ №2:

Просто используйте пробел между числом и «pt». Например:

 <Style TargetType="TextBlock">
    <Setter Property="FontFamily" Value="Segoe UI"/>
    <Setter Property="FontSize" Value="11 pt"/>
</Style>
  

Ответ №3:

Просто изменил ресурс с Double на String и включил спецификатор unit

 <sys:String x:Key="FontSize13">13pt</sys:String>
  

Комментарии:

1. К сожалению, это вызывает исключение ArgumentException во время выполнения.