Bungkus kata untuk label dalam Formulir Windows

184

Bagaimana seseorang bisa mendapatkan fungsionalitas bungkus kata Labeluntuk teks yang keluar dari batas?

Nagu
sumber

Jawaban:

167

Jawaban cepat: matikan AutoSize .

Masalah besar di sini adalah bahwa label tidak akan mengubah ketinggiannya secara otomatis (hanya lebar). Untuk melakukannya dengan benar, Anda perlu mensubclass label dan menyertakan logika pengubahan ukuran vertikal.

Pada dasarnya yang perlu Anda lakukan di OnPaint adalah:

  1. Ukur ketinggian teks (Graphics.MeasureString).
  2. Jika tinggi label tidak sama dengan tinggi teks, atur tinggi dan kembali.
  3. Gambar teksnya.

Anda juga perlu mengatur bendera gaya ResizeRedraw di konstruktor.

Jonathan C Dickinson
sumber
12
Pilih label yang Anda tambahkan teks secara dinamis. Lihatlah properti untuk label dan matikan AutoSize. Anda sekarang akan dapat menarik / mengatur area untuk label dan itu akan secara otomatis membungkus untuk tetap dalam parameter tersebut. Tidak perlu pengkodean tambahan.
madeFromCode
Inilah tepatnya yang saya cari karena berkaitan dengan memformat formulir saya dengan teks penjelasan yang ada dalam bentuk paragraf.
Philip Brack
1
@madeFromCode Anda harus mengatur ketinggian secara terprogram jika Anda ingin label membesar secara vertikal jika tidak, teks Anda akan terpotong.
Edwin
348

Sebenarnya, jawaban yang diterima tidak perlu rumit.

Jika Anda mengatur label ke AutoSize, label itu akan secara otomatis tumbuh dengan teks apa pun yang Anda masukkan ke dalamnya. (Ini termasuk pertumbuhan vertikal.)

Jika Anda ingin menjadikannya bungkus kata pada lebar tertentu, Anda dapat mengatur properti MaximumSize.

myLabel.MaximumSize = new Size(100, 0);
myLabel.AutoSize = true;

Diuji dan bekerja.

John Gietzen
sumber
10
Jika Anda memiliki label yang masuk ke dalam wadahnya, Anda dapat mematikan UkuranOtomatis, biarkan properti ukuran max apa adanya, dan itu akan membungkus kata persis seperti yang kita inginkan. CIUMAN di tempat kerja!
TheBlastOne
Anda tidak dapat mencapai lebar cairan dengan solusi itu.
Robin
1
@ Sam: Ya Anda bisa, Anda cukup mengatur properti "jangkar" yang tepat. Apakah Anda pernah mencobanya?
John Gietzen
1
Sam: Anda harus dapat mengatur Dockproperti label dan panel Top, bukan solusi saya.
John Gietzen
2
Saya telah mengaitkan pada OnResizeorang tua dan panggilanmyLabel.MaximumSize = new Size(Bounds.Width, 0);
Chris Morgan
23

Dalam kasus saya (label pada panel) saya mengatur label.AutoSize = falsedan label.Dock = Fill. Dan teks label dibungkus secara otomatis.

alex555
sumber
Ini membuat label mengisi seluruh formulir dan membuatnya mengaburkan semua kontrol lain dalam formulir ... Artinya, sepertinya tidak berfungsi. Apakah ada persyaratan lain sehingga tidak akan mengisi seluruh formulir?
Peter Mortensen
5
label ada di panel , bukan di formulir secara langsung. Oleh karena itu, teks tidak melebihi batas panel
alex555
OK, tapi bukankah itu mengaburkan semua kontrol lain di panel?
Peter Mortensen
1
Apa yang mencegah Anda membuat panel tambahan yang hanya berisi label?
alex555
Itu tampak seperti beberapa tata letak tambahan yang seharusnya tidak perlu. Tentunya label harus memiliki kotak sendiri daripada perlu dimasukkan ke dalam kotak lain.
Edwin
17

Tidak ada properti autowrap tetapi ini dapat dilakukan secara terprogram untuk mengukurnya secara dinamis. Berikut ini satu solusinya:

  • Pilih properti label

  • AutoSize = True

  • MaximumSize= ( Lebar , Tinggi ) di mana Lebar = ukuran maksimum yang Anda inginkan untuk label dan Tinggi = berapa banyak piksel yang ingin Anda bungkus

    Properti Sampel

Sebastian Castaldi
sumber
4
Satu lagi catatan, jika Anda meninggalkan ketinggian maksimum pada 0, itu akan terus berkembang secara vertikal.
palehorse
Label saya tidak memiliki properti AutoSize dan MaximumSize, bagaimana saya bisa menambahkan ini?
mrbengi
11

Dari MSDN , Secara Otomatis Bungkus Teks dengan Label :

using System;
using System.Text;
using System.Drawing;
using System.Windows.Forms;

public class GrowLabel : Label {
    private bool mGrowing;
    public GrowLabel() {
        this.AutoSize = false;
    }
    private void resizeLabel() {
        if (mGrowing) 
            return;
        try {
            mGrowing = true;
            Size sz = new Size(this.Width, Int32.MaxValue);
            sz = TextRenderer.MeasureText(this.Text, this.Font, sz, TextFormatFlags.WordBreak);
            this.Height = sz.Height;
        }
        finally {
            mGrowing = false;
        }
    }
    protected override void OnTextChanged(EventArgs e) {
        base.OnTextChanged(e);
        resizeLabel();
    }
    protected override void OnFontChanged(EventArgs e) {
        base.OnFontChanged(e);
        resizeLabel();
    }
    protected override void OnSizeChanged(EventArgs e) {
        base.OnSizeChanged(e);
        resizeLabel();
    }
}
hypo
sumber
Untuk memecah karakter daripada kata-kata (berguna ketika Anda memiliki string panjang tanpa spasi seperti path file), gunakan (TextFormatFlags.WordBreak | TextFormatFlags.TextBoxControl) sebagai gantinya. Lihat posting terakhir di utas MSDN yang sama.
Ohad Schneider
1
Juga, jangan lupa untuk memasukkan padding label atas dan bawah dalam perhitungan ( Height = sz.Height + Padding.Vertical;)
Igor Brejc
6

Saya harus menemukan solusi cepat, jadi saya hanya menggunakan TextBox dengan properti-properti itu:

var myLabel = new TextBox
                    {
                        Text = "xxx xxx xxx",
                        WordWrap = true,
                        AutoSize = false,
                        Enabled = false,
                        Size = new Size(60, 30),
                        BorderStyle = BorderStyle.None,
                        Multiline =  true,
                        BackColor =  container.BackColor
                    };
pengguna3356581
sumber
Ini adalah solusi yang baik, tetapi saya mungkin lebih suka menggunakan ReadOnly untuk pengaturan Diaktifkan ke false.
PahJoker
1
Ini adalah solusi imajinatif yang juga berfungsi dengan baik pada Compact Framework (di mana Label tidak memiliki properti AutoSize dan MaximumSize).
Tim Coulter
3

Dapatkan yang lebih baik berdasarkan jawaban @hypo

public class GrowLabel : Label {
    private bool mGrowing;
    public GrowLabel() {
        this.AutoSize = false;
    }
    private void resizeLabel() {
        if (mGrowing)
            return;
        try {
            mGrowing = true;
            int width = this.Parent == null ? this.Width : this.Parent.Width;

            Size sz = new Size(this.Width, Int32.MaxValue);
            sz = TextRenderer.MeasureText(this.Text, this.Font, sz, TextFormatFlags.WordBreak);
            this.Height = sz.Height + Padding.Bottom + Padding.Top;
        } finally {
            mGrowing = false;
        }
    }
    protected override void OnTextChanged(EventArgs e) {
        base.OnTextChanged(e);
        resizeLabel();
    }
    protected override void OnFontChanged(EventArgs e) {
        base.OnFontChanged(e);
        resizeLabel();
    }
    protected override void OnSizeChanged(EventArgs e) {
        base.OnSizeChanged(e);
        resizeLabel();
    }
}

int width = this.Parent == null ? this.Width : this.Parent.Width; ini memungkinkan Anda untuk menggunakan label tumbuh-otomatis ketika merapat ke orangtua, misalnya panel.

this.Height = sz.Height + Padding.Bottom + Padding.Top; di sini kami menangani bantalan untuk atas dan bawah.

march1993
sumber
1
  1. Masukkan label ke dalam panel
  2. Pegang ClientSizeChanged eventuntuk panel, membuat label mengisi ruang:

    private void Panel2_ClientSizeChanged(object sender, EventArgs e)
    {
        label1.MaximumSize = new Size((sender as Control).ClientSize.Width - label1.Left, 10000);
    }
  3. Atur Auto-Sizelabel untuktrue

  4. Atur Docklabel untukFill
Noelicus
sumber
Apakah langkah 3 dan 4 dilakukan pada perancang? Ada alasan mengapa mereka langkah 3 dan 4?
Stealth Rabbi
Mereka selesai di perancang (tetapi bisa dilakukan dalam kode jika Anda membutuhkannya) dan tidak ada alasan untuk pesanan.
noelicus
1

Tidak yakin itu akan cocok dengan semua use-case, tetapi saya sering menggunakan trik sederhana untuk mendapatkan perilaku pembungkus: masukkan Labeldengan Anda AutoSize=falsedi dalam 1x1 TableLayoutPanelyang akan mengurus Labelukurannya.

Pragmateek
sumber
1

Atur Properti AutoEllipsis ke 'TRUE' dan Properti AutoSize ke 'FALSE'.

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Ravi Kumar GN
sumber
0

Jika panel Anda membatasi lebar label Anda, Anda dapat mengatur properti Anchor label Anda ke Kiri, Kanan dan set AutoSize ke true. Ini secara konseptual mirip dengan mendengarkan acara Panel SizeChangeddan memperbarui label MaximumSize label ke new Size(((Control)sender).Size.Width, 0)seperti yang disarankan oleh jawaban sebelumnya . Setiap sisi yang tercantum dalam properti Anchor, well, berlabuh ke sisi bagian dalam Kontrol masing-masing. Jadi daftar dua sisi yang berlawanan di Anchor secara efektif menentukan dimensi kontrol. Penahan ke Kiri dan Kanan mengatur properti Lebar Kontrol dan Penahan ke Atas dan Bawah akan mengatur properti Ketinggiannya.

Solusi ini, seperti C #:

label.Anchor = AnchorStyles.Left | AnchorStyles.Right;
label.AutoSize = true;
binki
sumber
Tidak bekerja Label meningkatkan lebar panel saya hanya saja tidak perlu dibungkus. Sayangnya, jendelanya tidak seluas.
ygoe
0

Jika Anda benar-benar ingin mengatur lebar label independen dari konten, saya menemukan bahwa cara termudah adalah ini:

  • Atur autosize true
  • Tetapkan lebar maksimum sesuai keinginan Anda
  • Atur lebar minimum secara identik

Sekarang label memiliki lebar konstan, tetapi menyesuaikan ketinggiannya secara otomatis.

Kemudian untuk teks dinamis, kurangi ukuran font. Jika perlu, gunakan cuplikan ini di sub di mana teks label diatur:

If Me.Size.Height - (Label12.Location.Y + Label12.Height) < 20 Then
    Dim naam As String = Label12.Font.Name
    Dim size As Single = Label12.Font.SizeInPoints - 1
    Label12.Font = New Font(naam, size)
End If
Kjell Verbeke
sumber
0

Ini membantu saya dalam Formulir saya yang disebut InpitWindow: In Designer for Label:

AutoSize = true;
Achors = Top, Left, Right.

private void InputWindow_Shown(object sender, EventArgs e) {
    lbCaption.MaximumSize = new Size(this.ClientSize.Width - btOK.Width - btOK.Margin.Left - btOK.Margin.Right -
        lbCaption.Margin.Right - lbCaption.Margin.Left, 
        Screen.GetWorkingArea(this).Height / 2);
    this.Height = this.Height + (lbCaption.Height - btOK.Height - btCancel.Height);
    //Uncomment this line to prevent form height chage to values lower than initial height
    //this.MinimumSize = new Size(this.MinimumSize.Width, this.Height);
}
//Use this handler if you want your label change it size according to form clientsize.
private void InputWindow_ClientSizeChanged(object sender, EventArgs e) {
    lbCaption.MaximumSize = new Size(this.ClientSize.Width - btOK.Width - btOK.Margin.Left * 2 - btOK.Margin.Right * 2 -
        lbCaption.Margin.Right * 2 - lbCaption.Margin.Left * 2,
        Screen.GetWorkingArea(this).Height / 2);
}

Seluruh kode formulir saya

Mik
sumber
0

Jika dimensi tombol perlu dijaga agar tidak berubah:

myButton.Text = "word\r\nwrapped"
rjain
sumber
0

Jawaban sederhana untuk masalah ini adalah mengubah properti DOCK dari Label. Ini adalah "NONE" secara default.

Sunil Neeradi
sumber
0

Jika Anda memasukkan teks ke label sebelumnya, Anda bisa melakukan ini.

  1. Di perancang, Klik kanan pada label dan klik Properti.
  2. Di Properties, cari tab teks.
  3. Klik pada tab dan klik tombol panah di sebelahnya.
  4. Sebuah kotak akan muncul di atasnya.
  5. Anda dapat menekan enter di kotak sembulan untuk menambahkan garis dan mengetik seperti pada notepad! (PRESS ENTER DI MANA ANDA INGIN MEMBUAT TEKS LABEL)
DJ
sumber
-12

Gunakan style="overflow:Scroll"dalam label seperti pada HTML di bawah ini. Ini akan menambahkan bilah gulir di label di dalam panel.

<asp:Label
    ID="txtAOI"
    runat="server"
    style="overflow:Scroll"
    CssClass="areatext"
    BackColor="White"
    BorderColor="Gray"
    BorderWidth="1"
    Width = "900" ></asp:Label>
Jain yang manis
sumber
3
Memilih ini baik-baik saja, tetapi setidaknya katakan mengapa Anda melakukannya. Alasan ini ditolak karena <asp: Label> tidak digunakan di WinForms. Jawaban ini untuk platform yang salah.
theJerm
4
karena asp.net bukan winform
Trikaldarshi