2010-01-06 9 views
7

Tengo un Viewbox con un número de TextBlock s que están a escala y perfectamente posicionados por el ViewBox. Algo como esto:¿Cómo mantengo FontSize constante en WPF 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> 

Si el usuario cambia el tamaño de las Viewbox sus contenidos están perfectamente escalados para que coincida. Sin embargo, me gustaría mantener el FontSize en 12 independientemente del tamaño real del Viewbox.

¿Cómo puedo hacer esto? ¿Puedo hacer esto en XAML sin asociarme a un evento Resize?

Respuesta

10

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> 
+1

Gracias. Creo que simplifiqué demasiado mi ejemplo. Necesito Viewbox para encargarme de la posición de mi texto, pero no es FontSize. – Hallgrim

+1

Agregué una alternativa a mi respuesta, pruébelo. Es un poco exagerado, pero podría funcionar :) –

+0

¡Impresionante! Eso funcionó, pero esperaba algo un poco más simple. – Hallgrim

7

Esto también puede ser una solución fácil.

<Viewbox StretchDirection="DownOnly" > 
    <Label Content="Enable" FontSize="10" FontStretch="Normal" /> 
</Viewbox> 
Cuestiones relacionadas