Come posso avvolgere il testo in un'etichetta usando WPF?


251

Ho una TextBoxe un'etichetta. Dopo aver fatto clic su un pulsante, eseguo il seguente codice:

 label1.Content = textbox1.Text; 

La mia domanda è: come posso abilitare il wrapping del testo dell'etichetta? Potrebbe esserci troppo testo da visualizzare su una riga e, in tal caso, desidero che venga automaticamente spostato su più righe.

Risposte:


390

Il Labelcontrollo non supporta direttamente il wrapping del testo in WPF. Dovresti usare TextBlockinvece un . (Naturalmente, puoi posizionare l' TextBlock interno di un Labelcontrollo, se lo desideri.)

Codice di esempio:

<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 si IsReadOnly="true"imita a imitare un'etichetta :)
JulianM il

7
Questo va bene, ma non se si desidera utilizzare la funzione Proprietà target dell'etichetta, il che per essere onesti è probabilmente l' unica ragione per cui si dovrebbe usare un'etichetta su un blocco di testo. Ho fornito una risposta a questa domanda che mostra come ottenere un involucro in un'etichetta (sotto)
PaulJ

24
JulianM - già in sola lettura stackoverflow.com/questions/5073244/making-textblock-readonly ? Forse non erano nel 2011
Martin Capodici

12
@JulianM sei confuso TextBlockcon TextBox? - TextBlockSono stati di sola lettura poiché WPF era il codice chiamato "Avalon".
BrainSlugs83

Ho dovuto impostare Padding="5"per abbinare il padding negli altri miei Labelcontrolli sul modulo. Vedi la risposta di Rajesh di seguito.
Bob Kaufman,

105

Spesso non è possibile sostituire un Labelcon un TextBlockcome si desidera utilizzare la Targetproprietà (che imposta lo stato attivo sul controllo mirato quando si utilizza la tastiera, ad esempio ALT + C nel codice di esempio riportato di seguito), poiché è tutto ciò che Labelrealmente offre su a TextBlock.

Tuttavia, a Labelutilizza a TextBlockper eseguire il rendering del testo (se viene inserita una stringa nella Contentproprietà, che in genere è); quindi, puoi aggiungere uno stile TextBlockall'interno di Labellike così:

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

In questo modo puoi mantenere la funzionalità di un po ' Labelanche essere in grado di avvolgere il testo.


3
Funziona davvero? Da quello che ho visto il blocco di testo che WPF aggiunge non esiste nella struttura logica e non raccoglierà la tua risorsa.
Gusdor,

2
Sì, questo funziona: l'ho provato prima di pubblicare la mia risposta. Hai ragione nel dire che gli elementi presi di mira non si trovano nell'albero logico, ma è l'albero visivo che conta qui.
PaulJ,

11
Ha pochi anni ma non sembra funzionare con VS 2015. Ciò che sembra funzionare è l'utilizzo di un TextBlock in un'etichetta <Label> <TextBlock TextWrapping = "Wrap" Text = "Qualunque cosa" /> </Label>
David,

93

Ho usato il seguente codice.

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

4
Questo è ciò che ha funzionato meglio per me. Semplice, non è necessario utilizzare altri controlli o aggiungere molto codice.
Yisela,

3
@jeremychan, lo segnerei come risposta. Sono felice di aver fatto scorrere verso il basso e ho visto questa risposta.
Mehrad,

Ripristino il mio voto positivo. Ho provato a usarlo ma ha superato il mio "HorizontalAlignment =" Center "". A differenza di TextBlock, non ... ha fatto
Jack Frost

4
La parte Label.Content non è necessaria, poiché qualsiasi cosa all'interno del tag label è automaticamente contenuto. Tuttavia, un'ottima risposta in quanto mantiene la capacità di fornire chiavi di accesso, in cui tutte le soluzioni che utilizzano un TextBlock non riescono in questo senso.
Rob G

35

Puoi inserire un TextBlock all'interno dell'etichetta:

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

4
Mi piace questo approccio perché consente ai tuoi stili di etichetta di essere applicati a questo blocco di testo senza dover creare stili aggiuntivi per il blocco di testo.
Soggetto

15

Per avvolgere il testo nel controllo etichetta, modificare il modello di etichetta come segue:

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

Addendum: se è necessario aggiungere la disposizione del testo o di altre proprietà TextBlock-specifiche che si può mescolare-in con la seguente ricetta stackoverflow.com/questions/3970285/...
Yury Schkatula

12

Invece di usare una classe Label, consiglierei di usare un TextBlock . Questo ti permette di impostare il TextWrapping in modo appropriato.

Puoi sempre fare:

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

Tuttavia, se tutta questa "etichetta" è per visualizzare il testo, utilizzare TextBlockinvece un .


Ho finito con questo metodo per popolare i contenuti dinamici delle etichette. Sembra essere il metodo più semplice e pulito. Immagino che potresti incorporare la linea nella definizione label1, ovvero <br/>Label label1 = new Label() { Content = new TextBlock() { Text = caption, TextWrapping = TextWrapping.Wrap }, FontWeight = FontWeights.Normal };
dashrader

4

Dobbiamo mettere un qualche tipo di controllo che possa avvolgere il testo come 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>

2

prova ad usare questo

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

L'ho usato per recuperare i dati dal database MySql:

AccessText a = new AccessText();    
a.Text=reader[1].ToString();       // MySql reader
a.Width = 70;
a.TextWrapping = TextWrapping.WrapWithOverflow;
labels[i].Content = a;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.