¿Cómo puedo envolver texto en una etiqueta usando WPF?

251

Tengo una TextBoxy una etiqueta. Después de hacer clic en un botón, ejecuto el siguiente código:

 label1.Content = textbox1.Text; 

Mi pregunta es, ¿cómo habilito 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.

jeremychan
fuente

Respuestas:

390

El Labelcontrol no admite directamente el ajuste de texto en WPF. Deberías usar un TextBlocken su lugar. (Por supuesto, puede colocar el TextBlock interior de un Labelcontrol, si lo desea).

Código de 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>
Cody Gray
fuente
30
... y configurar IsReadOnly="true"para imitar una etiqueta :)
JulianM
77
Esto está bien, pero no si desea usar la característica de propiedad Target de la etiqueta, lo que para ser justos es probablemente la única razón por la que usaría una etiqueta sobre un TextBlock. He proporcionado una respuesta a esta pregunta que muestra cómo envolver en una etiqueta (abajo)
PaulJ
24
JulianM: ya solo leen stackoverflow.com/questions/5073244/making-textblock-readonly ? Tal vez no fueron en 2011
Martin Capodici
12
@JulianM estás confundiendo TextBlockcon TextBox? - TextBlockHan sido de solo lectura desde que WPF tenía el nombre de código "Avalon".
BrainSlugs83
Necesitaba configurar Padding="5"para que coincida con el relleno en mis otros Labelcontroles en el formulario. Ver la respuesta de Rajesh a continuación.
Bob Kaufman
105

A menudo no puede reemplazar a Labelpor a, TextBlockya que desea usar la Targetpropiedad (que establece el foco en el control de destino cuando se usa el teclado, por ejemplo, ALT + C en el código de muestra a continuación), ya que eso es todo lo que Labelrealmente ofrece sobre a TextBlock.

Sin embargo, a Labelusa a TextBlockpara representar texto (si se coloca una cadena en la Contentpropiedad, que normalmente es); por lo tanto, puede agregar un estilo para TextBlockdentro del Labelmismo modo:

<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, puedes mantener la funcionalidad de un Labeltiempo y al mismo tiempo poder ajustar el texto.

PaulJ
fuente
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á su recurso.
Gusdor
2
Sí, esto funciona, lo probé antes de publicar mi respuesta. Tienes razón en que los elementos seleccionados no están en el árbol lógico, pero lo que importa aquí es el árbol visual.
PaulJ
11
Esto tiene algunos años, pero no parece funcionar con VS 2015. Lo que parece funcionar es usar un TextBlock en una etiqueta <Label> <TextBlock TextWrapping = "Wrap" Text = "Whatever" /> </Label>
David
93

Use el siguiente código.

    <Label>
        <Label.Content>
            <AccessText TextWrapping="Wrap" Text="xxxxx"/>
        </Label.Content>
    </Label>
bbdaffy
fuente
44
Esto es lo que funcionó mejor para mí. Simple, no es necesario usar otros controles o agregar mucho código.
Yisela
3
@ jeremychan, marcaría esto como la respuesta. Estoy feliz de haberme desplazado hacia abajo y haber visto esta respuesta.
Mehrad
Revierto mi voto positivo. Intenté usar esto, pero omitió mi "HorizontalAlignment =" Center "". A diferencia de usar Textblock, no lo hizo ...
Jack Frost
44
La parte Label.Content es innecesaria, ya que cualquier cosa dentro de la etiqueta label es contenido automáticamente. Sin embargo, es una excelente respuesta, ya que conserva la capacidad de proporcionar claves de acceso, donde todas las soluciones que utilizan un TextBlock fallan en este sentido.
Rob G
35

Puedes poner un TextBlock dentro de la etiqueta:

<Label> 
  <TextBlock Text="Long Text . . . ." TextWrapping="Wrap" /> 
</Label> 
Adrian Fâciu
fuente
44
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
15

Para ajustar el texto en el control de etiqueta, cambie la plantilla de 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>
Rajesh R. Naik
fuente
Anexo: si necesita agregar ajuste de texto u otras propiedades específicas de TextBlock, puede mezclarlo con la siguiente receta stackoverflow.com/questions/3970285/…
Yury Schkatula
12

En lugar de usar una clase Label, recomendaría usar un TextBlock . Esto le permite configurar TextWrapping adecuadamente.

Siempre puedes hacer:

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

Sin embargo, si toda esta "etiqueta" es para mostrar texto, utilice en su TextBlocklugar.

Reed Copsey
fuente
Terminé usando este método para llenar el contenido dinámico de la etiqueta. Parece ser el método más fácil y limpio. Me imagino que podría incorporar la línea en la definición de la etiqueta 1, es decir, <br/>Label label1 = new Label() { Content = new TextBlock() { Text = caption, TextWrapping = TextWrapping.Wrap }, FontWeight = FontWeights.Normal };
dashrader
4

Necesitamos poner algún tipo de control que pueda ajustar texto como textblock / textbox

 <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>
Kylo Ren
fuente
2

intenta usar esto

lblresult.Content = lblresult.Content + "prime are :" + j + "\n";
RathapongPumpo
fuente
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>
Khalid
fuente
2

Usé esto para recuperar datos de la base de datos MySql:

AccessText a = new AccessText();    
a.Text=reader[1].ToString();       // MySql reader
a.Width = 70;
a.TextWrapping = TextWrapping.WrapWithOverflow;
labels[i].Content = a;
DiogoA.
fuente