ViewBox
no le permitirá mantener un tamaño de fuente constante, simplemente así no es como funciona. Es necesario poner el texto fuera del cuadro de vista para que eso ocurra:
<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>
Tenga en cuenta que me quita la propiedad Ancho de la TextBlock
, acabo de dejar que se extienden por la anchura de la rejilla, dejando que la alineación del texto toma cuidado del centrado.
O bien, puede ser creativo y enlazar la propiedad FontSize
a la ActualWidth
del ViewBox
y hacer que la escala apropiada, por ejemplo:
Convertidor:
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();
}
}
Uso:
<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>
Gracias. Creo que simplifiqué demasiado mi ejemplo. Necesito Viewbox para encargarme de la posición de mi texto, pero no es FontSize. – Hallgrim
Agregué una alternativa a mi respuesta, pruébelo. Es un poco exagerado, pero podría funcionar :) –
¡Impresionante! Eso funcionó, pero esperaba algo un poco más simple. – Hallgrim