Как я сохраняю постоянный FontSize в WPF Viewbox?

У меня есть a Viewbox со многими TextBlocks, которые масштабируются и располагаются отлично ViewBox. Что-то вроде этого:

<Viewbox Stretch="Uniform">
    <Canvas Width="100" Height="100">
        <Ellipse Width="100" Height="100" Stroke="Black"/>
        <TextBlock Width="100" TextAlignment="Center" FontSize="12">Top Center</TextBlock>
    </Canvas>
</Viewbox>

Если пользователь изменяет размер Viewbox его содержание отлично масштабируется для соответствия. Однако я хотел бы сохранить FontSize к 12 независимо от фактического размера Viewbox.

Как я могу сделать это? Я могу сделать это в XAML, не присоединяя к Resize событие?

7
задан Dave Clemmer 12 September 2011 в 17:51
поделиться

1 ответ

ViewBox не позволит сохранить постоянный размер шрифта, просто так это не работает. Для этого нужно вывести текст за пределы поля зрения:

<Grid>
    <Viewbox Stretch="Uniform">
        <Canvas Width="100" Height="100">
            <Ellipse Width="100" Height="100" Stroke="Black"/>
        </Canvas>
    </Viewbox>
    <TextBlock TextAlignment="Center" FontSize="12">Top Center</TextBlock>
</Grid>

Обратите внимание, что я удалил свойство Width из TextBlock, я просто растянул его на ширину сетки, позволив выровнять текст по центру.

Или вы можете творчески подойти и связать свойство Размер шрифта со свойством ActualWidth из ViewBox и, имея его соответствующий масштаб, например:

Converter:

class ViewBoxConstantFontSizeConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (!(value is double)) return null;
        double d = (double)value;
        return 100 / d * 12;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

Использование:

<Window.Resources>
    ...
    <local:ViewBoxConstantFontSizeConverter x:Key="conv"/>
</Window.Resources>
...
<Viewbox Name="vb" Stretch="Uniform">
    <Canvas Width="100" Height="100">
        <Ellipse Width="100" Height="100" Stroke="Black"/>
        <TextBlock Width="100" TextAlignment="Center"
                   FontSize="{Binding ElementName=vb, 
                                      Path=ActualWidth, 
                                      Converter={StaticResource conv}}">
            Top Center
        </TextBlock>
    </Canvas>
</Viewbox>
11
ответ дан 6 December 2019 в 10:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: