Wie kann ich mit WPF Text in ein Etikett einschließen?

251

Ich habe ein TextBoxund ein Etikett. Nach dem Klicken auf eine Schaltfläche führe ich den folgenden Code aus:

 label1.Content = textbox1.Text; 

Meine Frage ist, wie ich den Textumbruch des Etiketts aktivieren kann. Möglicherweise ist zu viel Text in einer Zeile angezeigt, und ich möchte, dass er automatisch in mehrere Zeilen umgebrochen wird, wenn dies der Fall ist.

Jeremychan
quelle

Antworten:

390

Das LabelSteuerelement unterstützt das direkte Umbrechen von Text in WPF nicht. Sie sollten TextBlockstattdessen ein verwenden. (Natürlich können Sie das TextBlock Innere einesLabel Steuerelements platzieren, wenn Sie möchten.)

Beispielcode:

<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 Grey
quelle
30
... und IsReadOnly="true"ein Label imitieren :)
JulianM
7
Dies ist in Ordnung, aber nicht, wenn Sie die Target-Eigenschaftsfunktion des Labels verwenden möchten. Um fair zu sein, ist dies wahrscheinlich der einzige Grund, warum Sie ein Label über einem TextBlock verwenden würden. Ich habe eine Antwort auf diese Frage gegeben, die zeigt, wie man ein Etikett einwickelt (
siehe
24
JulianM - sie haben bereits schreibgeschützt stackoverflow.com/questions/5073244/making-textblock-readonly ? Vielleicht waren sie nicht im Jahr 2011
Martin Capodici
12
@ JulianM verwechseln Sie TextBlockmit TextBox? - TextBlocksind schreibgeschützt, seit WPF den Code "Avalon" hat.
BrainSlugs83
Ich musste festlegen Padding="5", dass die Auffüllung in meinen anderen LabelSteuerelementen im Formular übereinstimmt . Siehe Rajeshs Antwort unten.
Bob Kaufman
105

Oft kann man nicht ersetzen Labelmit ein , TextBlockwie Sie die auf die Verwendung wollen TargetEigenschaft (die Sätze auf den Fokus gezielt Steuerung , wenn die Tastatur zB ALT + C in dem folgenden Beispielcode verwendet wird ), wie das ist alles ein Labelwirklich bietet über ein TextBlock.

A Labelverwendet jedoch a TextBlockzum Rendern von Text (wenn eine Zeichenfolge in der ContentEigenschaft platziert ist, wie es normalerweise der Fall ist). Daher können Sie einen Stil für das TextBlockInnere hinzufügen Label:

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

Auf diese Weise behalten Sie die Funktionalität von a Labelbei und können gleichzeitig den Text umbrechen.

PaulJ
quelle
3
Funktioniert das tatsächlich? Soweit ich gesehen habe, ist der von WPF hinzugefügte Textblock nicht im logischen Baum vorhanden und nimmt Ihre Ressource nicht auf.
Gusdor
2
Ja, das funktioniert - ich habe es getestet, bevor ich meine Antwort veröffentlicht habe. Sie haben Recht damit, dass sich die angesprochenen Elemente nicht im logischen Baum befinden, sondern dass es auf den visuellen Baum ankommt.
PaulJ
11
Dies ist ein paar Jahre alt, aber dies scheint mit VS 2015 nicht zu funktionieren. Was zu funktionieren scheint, ist die Verwendung eines TextBlocks in einem Label <Label> <TextBlock TextWrapping = "Wrap" Text = "Whatever" /> </ Label>
David
93

Ich habe den folgenden Code verwendet.

    <Label>
        <Label.Content>
            <AccessText TextWrapping="Wrap" Text="xxxxx"/>
        </Label.Content>
    </Label>
bbdaffy
quelle
4
Das hat bei mir am besten funktioniert. Einfach, keine Notwendigkeit, andere Steuerelemente zu verwenden oder viel Code hinzuzufügen.
Yisela
3
@ Jeremyychan, ich würde dies als Antwort markieren. Ich bin froh, dass ich nach unten gescrollt und diese Antwort gesehen habe.
Mehrad
Ich habe meine Up-Abstimmung zurückgesetzt. Ich habe versucht, dies zu verwenden, aber es hat meine "HorizontalAlignment =" Center "" umgangen. Im Gegensatz zu Textblock hat es nicht ...
Jack Frost
4
Der Label.Content-Teil ist nicht erforderlich, da alles innerhalb des Label-Tags automatisch Inhalt ist. Eine hervorragende Antwort, da weiterhin Zugriffsschlüssel bereitgestellt werden können, bei denen alle Lösungen, die einen TextBlock verwenden, in dieser Hinsicht fehlschlagen.
Rob G
35

Sie können einen TextBlock in das Etikett einfügen:

<Label> 
  <TextBlock Text="Long Text . . . ." TextWrapping="Wrap" /> 
</Label> 
Adrian Fâciu
quelle
4
Ich mag diesen Ansatz, weil Ihre Label-Stile auf diesen Textblock angewendet werden können, ohne dass zusätzliche Stile für den TextBlock erstellt werden müssen.
Sogger
15

Ändern Sie die Vorlage der Beschriftung wie folgt, um Text in das Beschriftungssteuerelement einzuschließen:

<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
quelle
Nachtrag: Wenn Sie Textumbruch oder andere TextBlock-spezifische Eigenschaften hinzufügen müssen, können Sie diese mit dem folgenden Rezept mischen. Stackoverflow.com/questions/3970285/…
Yury Schkatula
12

Anstelle einer Label-Klasse würde ich die Verwendung eines TextBlock empfehlen . Auf diese Weise können Sie das TextWrapping entsprechend einstellen .

Sie können immer tun:

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

Wenn Sie jedoch nur Text anzeigen möchten, verwenden Sie TextBlockstattdessen ein.

Reed Copsey
quelle
Am Ende habe ich diese Methode zum Auffüllen von dynamischen Etiketteninhalten verwendet. Scheint die einfachste und sauberste Methode zu sein. Ich stelle mir vor, Sie könnten die Zeile in die label1-Definition aufnehmen, dh <br/>Label label1 = new Label() { Content = new TextBlock() { Text = caption, TextWrapping = TextWrapping.Wrap }, FontWeight = FontWeights.Normal };
dashrader
4

Wir müssen eine Art Steuerelement einfügen, das Text wie Textblock / Textbox umbrechen kann

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

versuchen Sie dies zu verwenden

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

Ich habe dies verwendet, um Daten aus der MySQL-Datenbank abzurufen:

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