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.

jeremychan
fonte

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>
Cody Gray
fonte
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.

PaulJ
fonte
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>
bbdaffy
fonte
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> 
Adrian Fâciu
fonte
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>
Rajesh R. Naik
fonte
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.

Reed Copsey
fonte
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>
Kylo Ren
fonte
2

tente usar isso

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