Como quebrar o texto em um rótulo usando o WPF?


251

Eu tenho um TextBoxe um rótulo. Depois de clicar em um botão, eu executo o seguinte código:

 label1.Content = textbox1.Text; 

Minha pergunta é: como habilito a quebra de texto do rótulo? Pode haver muito texto para ser exibido em uma linha, e eu quero que ele seja quebrado automaticamente em várias linhas, se for o caso.

Respostas:


390

O Labelcontrole não suporta diretamente quebra automática de texto no WPF. Você deve usar um TextBlock. (Obviamente, você pode colocar o TextBlock interior de um Labelcontrole, se desejar.)

Código de amostra:

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

30
... e defina IsReadOnly="true"para imitar um Label :) #
JulianM

7
Isso é bom, mas não se você quiser usar o recurso de propriedade Target do Label - o que é justo é provavelmente o único motivo pelo qual você usaria um Label em um TextBlock. Eu tenho desde uma resposta a esta pergunta que mostram como obter embrulho em uma etiqueta (abaixo)
PaulJ

24
JulianM - eles já lêem apenas stackoverflow.com/questions/5073244/making-textblock-readonly ? Talvez eles não estavam em 2011
Martin Capodici

12
@JulianM você está confundindo TextBlockcom TextBox? - TextBlockforam somente leitura desde que o WPF recebeu o código "Avalon".
precisa saber é o seguinte

Eu precisava definir Padding="5"para coincidir com o preenchimento em meus outros Labelcontroles no formulário. Veja a resposta de Rajesh abaixo.
Bob Kaufman

105

Freqüentemente, você não pode substituir a Labelpor a TextBlockcomo deseja usar a Targetpropriedade (que define o foco no controle de destino ao usar o teclado, por exemplo, ALT + C no código de exemplo abaixo), pois isso é tudo o que Labelrealmente oferece sobre a TextBlock.

No entanto, a Labelusa a TextBlockpara renderizar texto (se uma string for colocada na Contentpropriedade, como normalmente é); portanto, você pode adicionar um estilo para TextBlockdentro, Labelassim:

<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" />

Dessa forma, você mantém a funcionalidade de um Labelenquanto também é capaz de quebrar o texto.


3
Isso realmente funciona? Pelo que vi, o bloco de texto que o WPF adiciona não existe na árvore lógica e não capta seu recurso.
Gusdor

2
Sim, isso funciona - eu testei antes de publicar minha resposta. Você tem razão em que os elementos visados ​​não estão na árvore lógica, mas é a árvore visual que importa aqui.
precisa saber é

11
Isso tem alguns anos, mas isso parece não funcionar com o VS 2015. O que parece funcionar é usar um TextBlock em um rótulo <Label> <TextBlock TextWrapping = "Wrap" Text = "Whatever" /> </Label>
David

93

Eu usei o seguinte código.

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

4
Isto é o que funcionou melhor para mim. Simples, não há necessidade de usar outros controles ou adicionar muito código.
Yisela

3
@jeremychan, eu marcaria isso como a resposta. Estou feliz que rolei para baixo e vi esta resposta.
Mehrad

Eu reverto meu voto. Tentei usá-lo, mas ele ignorou meu "HorizontalAlignment =" Center "". Ao contrário do Textblock, ele não ...
Jack Frost

4
A parte Label.Content é desnecessária, pois qualquer coisa na tag label é automaticamente conteúdo. No entanto, uma excelente resposta, pois mantém a capacidade de fornecer chaves de acesso, onde todas as soluções que usam um TextBlock falham nesse sentido.
Rob G

35

Você pode colocar um TextBlock dentro do rótulo:

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

4
Eu gosto dessa abordagem porque permite que seus estilos de etiqueta sejam aplicados a esse bloco de texto sem precisar criar estilos adicionais para o TextBlock.
Sogger

15

Para quebrar o texto no controle de rótulo, altere o modelo de rótulo da seguinte maneira:

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

Adendo: se você precisar adicionar quebra automática de texto ou outras propriedades específicas do TextBlock, poderá misturar-se com a seguinte receita stackoverflow.com/questions/3970285/…
Yury Schkatula

12

Em vez de usar uma classe Label, eu recomendaria o uso de um TextBlock . Isso permite que você defina o TextWrapping adequadamente.

Você sempre pode fazer:

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

No entanto, se todo esse "rótulo" é para exibir texto, use um TextBlock.


Acabei usando esse método para preencher o conteúdo do rótulo dinâmico. Parece ser o método mais fácil e limpo. Eu imagino que você poderia incorporar a linha na definição de label1, ou seja, <br/> #Label label1 = new Label() { Content = new TextBlock() { Text = caption, TextWrapping = TextWrapping.Wrap }, FontWeight = FontWeights.Normal };
dashrader 13/12/19

4

Precisamos colocar algum tipo de controle que possa quebrar texto como bloco de texto / caixa 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

tente usar isso

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

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>

2

Eu usei isso para recuperar dados do banco de dados MySql:

AccessText a = new AccessText();    
a.Text=reader[1].ToString();       // MySql reader
a.Width = 70;
a.TextWrapping = TextWrapping.WrapWithOverflow;
labels[i].Content = a;
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.