2011-08-18 16 views
7

Tengo un bloque de texto con una dimensión de Ancho = 511, Altura = 159. FontSize = 28. Quiero cambiar el tamaño de la fuente si el texto excede la dimensión del bloque de texto para que se muestre todo el texto. ¿Hay alguna forma de hacer esto? Una fórmula tal vez?Cambiar el tamaño de la fuente si el texto excede el límite de Textblock

+0

No quiero utilizar ViewBox porque se aleja del bloque de texto haciendo el menor anchura. Quiero mantener la dimensión del bloque de texto y simplemente cambiar el tamaño de la fuente. – patlimosnero

+2

Aquí hay una publicación similar con TextRenderer.MeasureText: http://stackoverflow.com/questions/1453327/relation-between-length-and-font-size-of-a-string-and-width-of-a-textbox. Me pregunto si hay una forma de adaptarlo a una relación de tamaño de fuente? – Josh

+0

Si ajusta su TextBlock en un ScrollViewer y luego maneja un evento cuando la barra de desplazamiento horizontal está a punto de aparecer. Luego puede cambiar el tamaño de la fuente y cancelar la barra de desplazamiento que aparece. En teoría ... No he comprobado si esto es posible todavía, pero lo haré. –

Respuesta

0

no estoy realmente seguro de WPF, pero en Windows Forms que podría utilizar MeasureString método, cuerdas para medir las dimensiones de una fuente dada. Entonces, cada vez que el contenido del bloque de texto cambia, solo necesita usar este método y si las dimensiones del texto son más grandes que las dimensiones del bloque de texto, reduzca el tamaño de la fuente y mida nuevamente.

(ahora, después de lo que he escrito esto, yo creo que debe haber un método más simple para esto)

0

Depende de qué tipo de fuente que utiliza, por ejemplo, Courier New está diseñado para tener cada carácter del el mismo ancho, así que si investigas cuál es el ancho por carácter, puedes usar la función de obtener longitud para la cadena (que te da la longitud en caracteres) y de allí calcular su ancho en píxeles. Si su ancho excede 511px, ajuste el tamaño en consecuencia.

Si usa una fuente diferente como Arial, puede hacer lo mismo y si realmente quiere que sea precisa, puede agrupar el alfabeto en letras angostas, como 'i', 'l', etc. y letras medianas como ' t 'y letras gordas como' o 'y las mayúsculas. Luego obtienes la cantidad de letras angostas, medianas y gruesas y calcula el tamaño a partir de esa información, pero personalmente, eso es demasiado para mí.

Espero que haya sido útil.

Editar: Ignora este, acabo de leer acerca de la función Measures, es un esfuerzo mucho más pequeño que mi sugerencia.

0

Esto es lo que se me ocurrió. Asegúrese de manejar el caso del tamaño de fuente de -1.0.

 private static double GetFontSize(TextBox textBox) 
     { 
     double fontSize = textBox.FontSize; 
     FormattedText ft = new FormattedText(textBox.Text, CultureInfo.CurrentCulture, System.Windows.FlowDirection.LeftToRight, 
              new Typeface(textBox.FontFamily, textBox.FontStyle, textBox.FontWeight, textBox.FontStretch), 
              fontSize, textBox.Foreground); 
     while (textBox.Width < ft.Width) 
     { 
      fontSize -= 1; 
      if (fontSize < 0) return -1.0; 
      ft = new FormattedText(textBox.Text, CultureInfo.CurrentCulture, System.Windows.FlowDirection.LeftToRight, 
                 new Typeface(textBox.FontFamily, textBox.FontStyle, textBox.FontWeight, textBox.FontStretch), 
                 fontSize, textBox.Foreground); 
     } 

     return fontSize; 
     } 
0

Editar: Debería mirar las etiquetas antes de publicar. No hay idea de lo que WPF podría ofrecer para resolver esto.

no tengo ninguna prueba para respaldar esto, pero parece que (también para fuentes de ancho variable, al menos todos los instalados en mi máquina):

  • Tamaño de la fuente lineal tiene una relación con el ancho de una cadena dada
  • tamaño de la fuente 0 resultados en una anchura de 0

Esto indica que probablemente podría utilizar MeasureString una vez en el mayor tamaño de la fuente permitido, y luego interpolar para encontrar el tamaño óptimo de la fuente .

Sin embargo, hay algunas "protuberancias de píxeles" en ese "camino lineal", por lo que podría tener algunos píxeles apagados, pero es una buena alternativa a los bucles de medida.

2

Esta solución implica el uso de un ViewBox, creo que con las características de transformación de Wpf no hay necesidad de cambiar el tamaño de fuente del texto. Casi el mismo resultado se puede obtener usando transformación (y un ViewBox en este caso) .

En lugar de poner su TextBlock dentro de un ViewBox, modificar su plantilla y poner el control en el que el texto aparece dentro de un ViewBox, algo así como:

<ControlTemplate TargetType="{x:Type TextBox}">      
    <Microsoft_Windows_Themes:ListBoxChrome x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderFocused="{TemplateBinding IsKeyboardFocusWithin}" SnapsToDevicePixels="true"> 
     <Viewbox HorizontalAlignment="Left"> 
      <ScrollViewer x:Name="PART_ContentHost" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
     </Viewbox> 
    </Microsoft_Windows_Themes:ListBoxChrome> 

    <ControlTemplate.Triggers> 
     <Trigger Property="IsEnabled" Value="false"> 
      <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/> 
      <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> 
     </Trigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

Ahora usted consigue un control que el tamaño de su texto para encajar el espacio disponible, gracias WPF.

También aquí es un poco de ejemplo

text example

Cuestiones relacionadas