Jawaban:
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:
Anda juga perlu mengatur bendera gaya ResizeRedraw di konstruktor.
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.
Dock
properti label dan panel Top
, bukan solusi saya.
OnResize
orang tua dan panggilanmyLabel.MaximumSize = new Size(Bounds.Width, 0);
Dalam kasus saya (label pada panel) saya mengatur label.AutoSize = false
dan label.Dock = Fill
. Dan teks label dibungkus secara otomatis.
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
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();
}
}
Height = sz.Height + Padding.Vertical;
)
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
};
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.
Pegang ClientSizeChanged event
untuk 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);
}
Atur Auto-Size
label untuktrue
Dock
label untukFill
Tidak yakin itu akan cocok dengan semua use-case, tetapi saya sering menggunakan trik sederhana untuk mendapatkan perilaku pembungkus: masukkan Label
dengan Anda AutoSize=false
di dalam 1x1 TableLayoutPanel
yang akan mengurus Label
ukurannya.
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 SizeChanged
dan 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;
Jika Anda benar-benar ingin mengatur lebar label independen dari konten, saya menemukan bahwa cara termudah adalah ini:
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
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);
}
Jawaban sederhana untuk masalah ini adalah mengubah properti DOCK dari Label. Ini adalah "NONE" secara default.
Jika Anda memasukkan teks ke label sebelumnya, Anda bisa melakukan ini.
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>