Как установить FontSize в pt, если мы используем StaticResource или DynamicResource?

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

 <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}" />

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

3 ответа

Решение

Преобразование типов происходит во время компиляции компилятором 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;
    }
}

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

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

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

<sys:String x:Key="FontSize13">13pt</sys:String>
Другие вопросы по тегам