Как сохранить постоянный размер шрифта в WPF Viewbox? - PullRequest
7 голосов
/ 06 января 2010

У меня есть Viewbox с числом TextBlock с, которые масштабируются и идеально позиционируются 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?

Ответы [ 2 ]

10 голосов
/ 06 января 2010

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, я просто позволил ему растягиваться по ширине сетки, позволяявыравнивание текста позаботится о центрировании.

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

Конвертер:

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>
7 голосов
/ 04 марта 2015

Это тоже может быть легко исправить.

<Viewbox StretchDirection="DownOnly" >
     <Label Content="Enable" FontSize="10" FontStretch="Normal" />
</Viewbox>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...