Bagaimana saya bisa membungkus teks dalam label menggunakan WPF?

251

Saya punya TextBox dan Label. Setelah mengklik tombol, saya menjalankan kode berikut:

 label1.Content = textbox1.Text; 

Pertanyaan saya adalah, bagaimana cara mengaktifkan pembungkus teks label? Mungkin ada terlalu banyak teks untuk ditampilkan pada satu baris, dan saya ingin membungkusnya secara otomatis ke beberapa baris jika itu masalahnya.

jeremychan
sumber

Jawaban:

390

The Labelkontrol tidak langsung mendukung membungkus teks dalam WPF. Anda harus menggunakan TextBlockgantinya. (Tentu saja, Anda dapat menempatkan bagian TextBlock dalam aLabel kontrol, jika Anda inginkan.)

Kode sampel:

<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
sumber
30
... dan atur IsReadOnly="true"untuk meniru Label :)
JulianM
7
Ini bagus, tetapi tidak jika Anda ingin menggunakan fitur properti Target dari Label - yang adil mungkin adalah satu - satunya alasan Anda menggunakan Label di atas TextBlock. Saya telah memberikan jawaban untuk pertanyaan ini yang menunjukkan bagaimana cara mendapatkan pembungkus dengan Label (di bawah)
PaulJ
24
JulianM - mereka sudah membaca hanya stackoverflow.com/questions/5073244/membuat-textblock-readonly ? Mungkin mereka tidak di 2011
Martin Capodici
12
@JulianM yang Anda membingungkan TextBlockdengan TextBox? - TextBlocktelah dibaca sejak WPF adalah kode bernama "Avalon".
BrainSlugs83
Saya perlu mengatur Padding="5"agar cocok dengan padding di Labelkontrol saya yang lain pada formulir. Lihat jawaban Rajesh di bawah ini.
Bob Kaufman
105

Seringkali Anda tidak dapat mengganti Labeldengan yang TextBlockAnda inginkan dengan menggunakan Targetproperti (yang menetapkan fokus ke kontrol yang ditargetkan ketika menggunakan keyboard misalnya ALT + C dalam kode contoh di bawah), karena itu semua Labelbenar - benar menawarkan lebih dari a TextBlock.

Namun, a Labelmenggunakan TextBlockuntuk merender teks (jika string ditempatkan di Contentproperti, yang biasanya); oleh karena itu, Anda dapat menambahkan gaya untuk TextBlockdi dalamnya Labelseperti:

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

Dengan cara ini Anda bisa menjaga fungsionalitas Labelsementara juga bisa membungkus teks.

PaulJ
sumber
3
Apakah ini berhasil? Dari apa yang saya lihat pada textblock yang ditambahkan WPF tidak ada di pohon logis dan tidak akan mengambil sumber Anda.
Gusdor
2
Ya, ini berhasil — saya mengujinya sebelum saya menerbitkan jawaban saya. Anda benar bahwa elemen-elemen yang ditargetkan tidak berada di pohon logis, tetapi pohon visual yang penting di sini.
PaulJ
11
Ini berumur beberapa tahun tetapi ini sepertinya tidak berfungsi dengan VS 2015. Apa yang tampaknya berfungsi adalah menggunakan TextBlock di label <Label> <TextBlock TextWrapping = "Wrap" Text = "Apapun" /> </Label>
David
93

Saya menggunakan kode berikut.

    <Label>
        <Label.Content>
            <AccessText TextWrapping="Wrap" Text="xxxxx"/>
        </Label.Content>
    </Label>
bbdaffy
sumber
4
Inilah yang paling berhasil bagi saya. Sederhana, tidak perlu menggunakan kontrol lain atau menambahkan banyak kode.
Yisela
3
@ jeremychan, saya akan menandai ini sebagai jawabannya. Saya senang bahwa saya menggulir ke bawah dan melihat jawaban ini.
Mehrad
Saya mengembalikan suara saya .. Saya mencoba menggunakan ini tetapi melewati "HorizontalAlignment =" Center "" saya. Tidak seperti menggunakan Textblock, itu tidak ...
Jack Frost
4
Bagian Label.Content tidak perlu, karena apa pun di dalam tag label adalah konten otomatis. Meskipun demikian, jawaban yang sangat baik karena mempertahankan kemampuan untuk menyediakan kunci akses, di mana semua solusi menggunakan TextBlock gagal dalam hal ini.
Rob G
35

Anda dapat meletakkan TextBlock di dalam label:

<Label> 
  <TextBlock Text="Long Text . . . ." TextWrapping="Wrap" /> 
</Label> 
Adrian Fâciu
sumber
4
Saya suka pendekatan ini karena memungkinkan gaya Label Anda berlaku untuk blok teks ini tanpa harus membuat gaya tambahan untuk TextBlock.
Sogger
15

Untuk membungkus teks dalam kontrol label, ubah template label sebagai berikut:

<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
sumber
Addendum: jika Anda perlu menambahkan pembungkus teks atau sifat TextBlock-spesifik lainnya Anda dapat mencampur-in dengan resep berikut stackoverflow.com/questions/3970285/...
Yury Schkatula
12

Alih-alih menggunakan kelas Label, saya akan merekomendasikan menggunakan TextBlock . Ini memungkinkan Anda untuk mengatur TextWrapping dengan tepat.

Anda selalu dapat melakukan:

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

Namun, jika semua ini "label" adalah untuk menampilkan teks, gunakan sebagai TextBlockgantinya.

Reed Copsey
sumber
Saya akhirnya menggunakan metode ini untuk mengisi konten label dinamis. Tampaknya menjadi metode termudah dan terbersih. Saya membayangkan Anda dapat memasukkan garis ke dalam definisi label1, yaitu <br/>Label label1 = new Label() { Content = new TextBlock() { Text = caption, TextWrapping = TextWrapping.Wrap }, FontWeight = FontWeights.Normal };
dashrader
4

Kita perlu menaruh semacam kontrol yang dapat membungkus teks seperti 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>
Kylo Ren
sumber
2

coba gunakan ini

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

Saya menggunakan ini untuk mengambil data dari MySql Database:

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