2011-09-13 15 views
27

tengo una ventana wpf donde tengo un panel de distribución con dos ventanas de visualización, cada ventana gráfica con un bloque de texto.¿Cómo puedo hacer que un WPF TextBlock muestre mi texto en múltiples líneas?

<Grid> 
    <StackPanel VerticalAlignment="Center" Orientation="Vertical" > 
     <Viewbox Margin="100,0,100,0"> 
      <TextBlock x:Name="headerText" Text="Lorem ipsum dolor" Foreground="Black"/> 
     </Viewbox> 
     <Viewbox Margin="150,0,150,0"> 
      <TextBlock x:Name="subHeaderText" Text="Lorem ipsum dolor, Lorem ipsum dolor, lorem isum dolor, Lorem ipsum dolor, Lorem ipsum dolor, lorem isum dolor, " TextWrapping="Wrap" Foreground="Gray" /> 
     </Viewbox> 
    </StackPanel> 
</Grid> 

Lo que me gustaría lograr es que el bloque de texto superior sea el encabezado con un texto más grande. El segundo bloque de texto es el subtítulo con un texto más pequeño. No importa cuánto texto haya para el encabezado o el subtítulo, la fuente debe ser más pequeña/más grande. Mi problema es que me gustaría que el subtítulo sea ancho fijo. Esto significa que, la fuente debe ser un porcentaje (70%) del encabezado y ajustar a varias líneas, dependiendo de la cantidad de texto que tengo. Encerré el código que tengo hasta ahora ... me falta algo con ese subtítulo, no sé qué. Saludos

Editar Básicamente lo que quiero lograr es que la cabecera sub envuelve el texto para que pueda expandir hacia abajo con la fuente de ser un 70% de la partida a - no importa lo grande que es la fuente.

+0

Cuál es la regla/ecuación de ajuste dinámico del tamaño. OK, el sub es del 70%, pero ¿cómo se dimensiona el primero? Si desea un ancho fijo para el segundo TextBlock, configure el ancho. – Paparazzi

+0

Esto es para usar en un entorno donde no conozco el tamaño/resolución de la pantalla. Entonces, el ancho se establece usando márgenes, lo que me permite comportarme de la misma manera en todas las pantallas. El tamaño del encabezado viene determinado por la ventana gráfica, esto significa que el bloque de texto siempre se muestra en tamaño máximo. - De nuevo dependiendo de la resolución de la pantalla. –

Respuesta

56

Anidación de un StackPanel hará que el cuadro de texto para envolver adecuadamente:

<Viewbox Margin="120,0,120,0"> 
    <StackPanel Orientation="Vertical" Width="400"> 
     <TextBlock x:Name="subHeaderText" 
        FontSize="20" 
        TextWrapping="Wrap" 
        Foreground="Black" 
        Text="Lorem ipsum dolor, lorem isum dolor,Lorem ipsum dolor sit amet, lorem ipsum dolor sit amet " /> 
    </StackPanel> 
</Viewbox> 
+6

¿Esto resuelve tu problema? Un ancho fijo y un tamaño de frente fijo parecen inconsistentes con la declaración del problema. – Paparazzi

+1

@Blam: en su lugar, puede usar MaxWidth si desea que el texto se ajuste, pero no desea un espacio excedente si es menor que el ancho. – Robotnik

3

Esto se pone parte del camino allí. No hay propiedad ActualFontSize, pero hay una Altura real y que se relacionaría con FontSize. En este momento, este es el único tamaño para el render original. No pude entender cómo registrar el convertidor como un evento de cambio de tamaño. En realidad, tal vez necesite registrar FontSize como un evento de cambio de tamaño. Por favor, no me marquen para una respuesta incompleta. No pude poner la muestra de código en un comentario.

<Window.Resources> 
     <local:WidthConverter x:Key="widthConverter"/> 
    </Window.Resources> 
    <Grid> 
     <Grid> 
      <StackPanel VerticalAlignment="Center" Orientation="Vertical" > 
       <Viewbox Margin="100,0,100,0"> 
        <TextBlock x:Name="headerText" Text="Lorem ipsum dolor" Foreground="Black"/> 
       </Viewbox> 
       <TextBlock Margin="150,0,150,0" FontSize="{Binding ElementName=headerText, Path=ActualHeight, Converter={StaticResource widthConverter}}" x:Name="subHeaderText" Text="Lorem ipsum dolor, Lorem ipsum dolor, lorem isum dolor, Lorem ipsum dolor, Lorem ipsum dolor, lorem isum dolor, " TextWrapping="Wrap" Foreground="Gray" /> 
      </StackPanel> 
     </Grid> 
    </Grid>   

convertidor

[ValueConversion(typeof(double), typeof(double))] 
    public class WidthConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      double width = (double)value*.7; 
      return width; // columnsCount; 
     } 

     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      throw new NotImplementedException(); 
     } 
    } 
2

Si lo que desea es tener su fuente encabezado un poco más grande que el resto, puede utilizar ScaleTransform. para que no dependas de la fuente real.

<TextBlock x:Name="headerText" Text="Lorem ipsum dolor"> 
       <TextBlock.LayoutTransform> 
        <ScaleTransform ScaleX="1.1" ScaleY="1.1" /> 
       </TextBlock.LayoutTransform> 
    </TextBlock> 
20

utilizar la propiedad TextWrapping del elemento TextBlock:

<TextBlock Text="StackOverflow Forum" 
      Width="100" 
      TextWrapping="WrapWithOverflow"/> 
+1

Esta es mi respuesta. Gracias. –

Cuestiones relacionadas