Jak owinąć tekst etykietą przy użyciu WPF?

251

Mam TextBoxetykietę i. Po kliknięciu przycisku wykonuję następujący kod:

 label1.Content = textbox1.Text; 

Moje pytanie brzmi: jak włączyć zawijanie tekstu etykiety? W jednym wierszu może być za dużo tekstu, aby w razie potrzeby automatycznie zawinąć go w wiele wierszy.

jeremychan
źródło

Odpowiedzi:

390

LabelKontrola nie obsługuje bezpośrednio zawijanie tekstu w WPF. Zamiast tego powinieneś użyć TextBlock. (Oczywiście, można umieścić TextBlock wewnątrz o Labelkontroli, jeśli chcesz).

Przykładowy kod:

<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
źródło
30
... i IsReadOnly="true"naśladować
Etykietę
7
Jest to w porządku, ale nie, jeśli chcesz użyć funkcji właściwości Target Label - która, mówiąc uczciwie, jest prawdopodobnie jedynym powodem, dla którego użyjesz Label nad TextBlock.
Podałem
24
JulianM - czytują już tylko stackoverflow.com/questions/5073244/making-textblock-readonly ? Może nie było ich w 2011 roku
Martin Capodici
12
@JulianM mylisz się TextBlockz TextBox? - TextBlocksą tylko do odczytu, ponieważ WPF był kodowany o nazwie „Avalon”.
BrainSlugs83 20.04.16
Musiałem ustawić Padding="5"dopasowanie do wypełnienia w moich innych Labelkontrolkach w formularzu. Zobacz odpowiedź Rajesha poniżej.
Bob Kaufman
105

Często nie możesz zamienić na Labela, TextBlockponieważ chcesz użyć Targetwłaściwości (która ustawia fokus na docelową kontrolkę podczas korzystania z klawiatury, np. ALT + C w przykładowym kodzie poniżej), ponieważ to wszystko Labelnaprawdę oferuje ponad TextBlock.

Jednak Labelużywa a TextBlockdo renderowania tekstu (jeśli ciąg jest umieszczony we Contentwłaściwości, którą zwykle jest); dlatego możesz dodać styl dla TextBlocktego Labeltypu, tak:

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

W ten sposób możesz zachować funkcjonalność przez Labelchwilę, a także mieć możliwość zawijania tekstu.

PaulJ
źródło
3
Czy to naprawdę działa? Z tego, co widziałem, blok tekstowy dodany przez WPF nie istnieje w drzewie logicznym i nie odbierze twojego zasobu.
Gusdor,
2
Tak, to działa - przetestowałem to przed opublikowaniem mojej odpowiedzi. Masz rację, że elementy docelowe nie znajdują się w drzewie logicznym, ale to drzewo wizualne ma tutaj znaczenie.
PaulJ
11
Ma to kilka lat, ale wydaje się, że nie działa z VS 2015. To, co wydaje się działać, to użycie TextBlock w etykiecie <Label> <TextBlock TextWrapping = "Wrap" Text = "Whthing" /> </Label>
David
93

Użyłem następującego kodu.

    <Label>
        <Label.Content>
            <AccessText TextWrapping="Wrap" Text="xxxxx"/>
        </Label.Content>
    </Label>
bbdaffy
źródło
4
To było najlepsze dla mnie. Proste, nie trzeba używać innych elementów sterujących ani dodawać dużej ilości kodu.
Yisela
3
@jeremychan, oznaczę to jako odpowiedź. Cieszę się, że przewinąłem w dół i zobaczyłem tę odpowiedź.
Mehrad
Cofam mój głos w górę. Próbowałem tego użyć, ale ominęło to moje „HorizontalAlignment =„ Center ””. W przeciwieństwie do korzystania z Textblocka, nie ...
Jack Frost
4
Część Label.Content nie jest potrzebna, ponieważ wszystko w znaczniku etykiety jest automatycznie treścią. Niemniej jednak doskonała odpowiedź, ponieważ zachowuje zdolność do dostarczania kluczy dostępu, w przypadku gdy wszystkie rozwiązania wykorzystujące TextBlock zawodzą pod tym względem.
Rob G
35

Możesz umieścić TextBlock wewnątrz etykiety:

<Label> 
  <TextBlock Text="Long Text . . . ." TextWrapping="Wrap" /> 
</Label> 
Adrian Fâciu
źródło
4
Podoba mi się to podejście, ponieważ umożliwia stosowanie stylów etykiet do tego bloku tekstowego bez konieczności tworzenia dodatkowych stylów dla TextBlock.
Sogger,
15

Aby zawinąć tekst w kontrolkę etykiety, zmień szablon etykiety w następujący sposób:

<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
źródło
Dodatek: jeśli chcesz dodać zawijanie tekstu lub inne właściwości specyficzne dla TextBlock, możesz połączyć go z następującym przepisem stackoverflow.com/questions/3970285/...
Yury Schkatula
12

Zamiast używać klasy Label, poleciłbym użycie TextBlock . To pozwala odpowiednio ustawić TextWrapping .

Zawsze możesz zrobić:

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

Jeśli jednak cała ta „etykieta” służy do wyświetlania tekstu, użyj TextBlockzamiast niej.

Reed Copsey
źródło
Skończyło się na użyciu tej metody do zapełniania zawartości dynamicznej etykiety. Wydaje się być najłatwiejszą i najczystszą metodą. Wyobrażam sobie, że możesz włączyć linię do definicji label1, tj. <br/>Label label1 = new Label() { Content = new TextBlock() { Text = caption, TextWrapping = TextWrapping.Wrap }, FontWeight = FontWeights.Normal };
dashrader
4

Musimy wprowadzić kontrolę, która może zawijać tekst, na przykład blok tekstu / pole tekstowe

 <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
źródło
2

spróbuj tego

lblresult.Content = lblresult.Content + "prime are :" + j + "\n";
RathapongPumpo
źródło
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
źródło
2

Użyłem tego, aby pobrać dane z bazy danych MySql:

AccessText a = new AccessText();    
a.Text=reader[1].ToString();       // MySql reader
a.Width = 70;
a.TextWrapping = TextWrapping.WrapWithOverflow;
labels[i].Content = a;
DiogoA.
źródło