2011-02-16 12 views
185

Tengo TextBox y una etiqueta. Después de hacer clic en un botón, ejecuto el siguiente código:¿Cómo puedo envolver texto en una etiqueta usando WPF?

label1.Content = textbox1.Text; 

Mi pregunta es, ¿Cómo se activa el ajuste de texto de la etiqueta? Puede haber demasiado texto para mostrar en una línea, y quiero que se ajuste automáticamente a varias líneas si ese es el caso.

Respuesta

293

El control Label no soporta directamente el ajuste de texto en WPF. Deberías usar un TextBlock en su lugar. (Por supuesto, se puede colocar la TextBlockdentro de un control Label, si lo desea.)

código

muestra:

<TextBlock TextWrapping="WrapWithOverflow"> 
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec adipiscing 
    nulla quis libero egestas lobortis. Duis blandit imperdiet ornare. Nulla 
    ac arcu ut purus placerat congue. Integer pretium fermentum gravida. 
</TextBlock> 
+20

... y configure 'IsReadOnly =" true "' para imitar una etiqueta :) – JulianM

+5

Esto está bien, pero no si desea utilizar la característica de propiedad Target de la etiqueta, que para ser justos es probablemente el * solo * razón por la cual usarías una etiqueta sobre un bloque de texto. He proporcionado una respuesta a esta pregunta que muestra cómo envolver en una etiqueta (abajo) – PaulJ

+16

JulianM - ¿ya se han leído solo http://stackoverflow.com/questions/5073244/making-textblock-readonly? Tal vez no estaban en 2011 –

10

En lugar de utilizar una clase Label, recomendaría utilizar un TextBlock. Esto le permite configurar el TextWrapping de manera adecuada.

Siempre se puede hacer:

label1.Content = new TextBlock() { Text = textBox1.Text, TextWrapping = TextWrapping.Wrap }; 

Sin embargo, si todo esto "etiqueta" es para es para mostrar el texto, utilice un TextBlock lugar.

+2

Eww asco, Reed! ¡¡¡Código detrás!!! El horror. El horror.

25

Usted puede poner un TextBlock dentro de la etiqueta:

<Label> 
    <TextBlock Text="Long Text . . . ." TextWrapping="Wrap" /> 
</Label> 
+2

Me gusta este enfoque porque permite que sus estilos de etiqueta se apliquen a este bloque de texto sin tener que crear estilos adicionales para TextBlock. – Sogger

12

ajustar el texto en el control de etiqueta, cambiar la plantilla de la etiqueta de la siguiente manera:

<Style x:Key="ErrorBoxStyle" TargetType="{x:Type Label}"> 
     <Setter Property="BorderBrush" Value="#FFF08A73"/> 
     <Setter Property="BorderThickness" Value="1"/> 
     <Setter Property="Foreground" Value="Red"/> 
     <Setter Property="Background" Value="#FFFFE3DF"/> 
     <Setter Property="FontWeight" Value="Bold"/> 
     <Setter Property="Padding" Value="5"/> 
     <Setter Property="HorizontalContentAlignment" Value="Left"/> 
     <Setter Property="VerticalContentAlignment" Value="Top"/> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type Label}"> 
        <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true" CornerRadius="5" HorizontalAlignment="Stretch"> 

         <TextBlock TextWrapping="Wrap" Text="{TemplateBinding Content}"/> 
        </Border> 

       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
+0

Adición: si necesita agregar texto ajustado u otras propiedades específicas de TextBlock puede mezclar con la siguiente receta http://stackoverflow.com/questions/3970285/wpf-4-contentpresenter-textwrapping-style-is-not -applied-to-implicitedly-generat –

90

a menudo no se puede reemplazar un Label con un TextBlock como desea el uso de la propiedad Target (que establece focu s para el control dirigido cuando se utiliza el teclado, p. ALT + C en el código de ejemplo a continuación), ya que es todo un Label realmente ofrece más de TextBlock.

Sin embargo, un Label utiliza un TextBlock para representar texto (si una cadena se coloca en la propiedad Content, que normalmente es); Por lo tanto, se puede añadir un estilo para TextBlock dentro del Label así:

<Label    
    Content="_Content Text:" 
    Target="{Binding ElementName=MyTargetControl}"> 
    <Label.Resources> 
     <Style TargetType="TextBlock"> 
      <Setter Property="TextWrapping" Value="Wrap" /> 
     </Style> 
    </Label.Resources> 
</Label> 
<CheckBox x:Name = "MyTargetControl" /> 

De esta manera se llega a mantener la funcionalidad de un Label que también sea capaz de ajustar el texto.

+3

¿Esto realmente funciona? Por lo que he visto, el bloque de texto que agrega WPF no existe en el árbol lógico y no recogerá tu recurso. – Gusdor

+2

Sí, esto funciona, lo probé antes de publicar mi respuesta. Tiene razón en que los elementos seleccionados no están en el árbol lógico, pero es el árbol visual lo que importa aquí. – PaulJ

+6

Esto debe marcarse como la respuesta. –

65

He utilizado el siguiente código.

<Label> 
     <Label.Content> 
      <AccessText TextWrapping="Wrap" Text="xxxxx"/> 
     </Label.Content> 
    </Label> 
+3

Esto es lo que funcionó mejor para mí. Simple, sin necesidad de usar otros controles o agregar mucho código. – Yisela

+1

@jeremychan, marcaría esto como la respuesta. Estoy feliz de haber bajado y haber visto esta respuesta. – Mehrad

+0

Revoco mi voto ... Intenté usar esto pero pasó por alto mi "HorizontalAlignment =" Center "". A diferencia del uso de Textblock, no ... –

2

utilización probar este

lblresult.Content = lblresult.Content + "prime are :" + j + "\n"; 
3

Tenemos que poner algún tipo de control que se puede ajustar el texto como bloque de texto/cuadro de texto

<Label Width="120" Height="100" > 
     <TextBlock TextWrapping="Wrap"> 
      this is a very long text inside a textblock and this needs to be on multiline. 
     </TextBlock> 
    </Label> 
2
<Label x:Name="datetimeofmsg" 
      HorizontalAlignment="Left" Margin="4.286,55,0,0" 
      VerticalAlignment="Top" Background="{x:Null}" 
      FontWeight="Bold" Width="61.714" Height="20" Foreground="White"> 
     <Label.Content> 
      <AccessText TextWrapping="Wrap"/> 
     </Label.Content> 
    </Label> 
Cuestiones relacionadas