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