Yanıtlar:
Hızlı cevap: Otomatik Boyutu kapat .
Buradaki en büyük sorun, etiketin yüksekliğini otomatik olarak değiştirmemesidir (sadece genişlik). Bu hakkı elde etmek için etiketi alt sınıflandırmanız ve dikey yeniden boyutlandırma mantığı eklemeniz gerekir.
Temel olarak OnPaint'te yapmanız gerekenler:
Ayrıca yapıcıda ResizeRedraw stil bayrağını ayarlamanız gerekir .
Aslında, kabul edilen cevap gereksiz yere karmaşıktır.
Etiketi Otomatik Boyut olarak ayarlarsanız, içine koyduğunuz metinle birlikte otomatik olarak büyür. (Bu dikey büyümeyi içerir.)
Belirli bir genişlikte sözcük kaydırması yapmak istiyorsanız, MaximumSize özelliğini ayarlayabilirsiniz.
myLabel.MaximumSize = new Size(100, 0);
myLabel.AutoSize = true;
Test edildi ve çalışıyor.
Dock
hem etiketin hem de panelin özelliğini ayarlayabilmelisiniz Top
.
OnResize
Ebeveyn ve ahizeye kilitlendimmyLabel.MaximumSize = new Size(Bounds.Width, 0);
Benim durumumda (paneldeki etiket) label.AutoSize = false
ve ayarladım label.Dock = Fill
. Ve etiket metni otomatik olarak sarılır.
Autowrap özelliği yoktur, ancak bu dinamik olarak boyutlandırmak için programlı olarak yapılabilir. İşte bir çözüm:
Etiketin özelliklerini seçin
AutoSize
= True
MaximumSize
= ( Genişlik , Yükseklik ) burada Genişlik = etiketin olmasını istediğiniz maksimum boyut ve Yükseklik = kaç tane piksel kaydırmasını istediğiniz
Gönderen MSDN , Label'da otomatik Wrap Text :
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;
)
Ben hızlı bir çözüm bulmak zorunda, bu yüzden sadece bu özellikleri ile bir TextBox kullanılır:
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
};
@Hypo'nun cevabına göre daha iyi bir tane var
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;
bu, bir üst öğeye, örneğin bir panele yerleştirildiğinde otomatik büyütme etiketi kullanmanızı sağlar.
this.Height = sz.Height + Padding.Bottom + Padding.Top;
burada üst ve alt için dolgu ile ilgileniyoruz.
ClientSizeChanged event
Etiketi boşluğu doldurarak panel için kullanın :
private void Panel2_ClientSizeChanged(object sender, EventArgs e)
{
label1.MaximumSize = new Size((sender as Control).ClientSize.Width - label1.Left, 10000);
}
Auto-Size
Etiketi şu şekilde ayarlayın :true
Dock
Etiketi şu şekilde ayarlayın :Fill
Değil emin eğer kullanım-durumlarda uyacak ama sık sık sarma davranışını elde etmek için basit hile kullanma: koymak Label
ile AutoSize=false
bir 1x1 iç TableLayoutPanel
ilgilenir Label
'ın boyutu.
Paneliniz etiketinizin genişliğini sınırlıyorsa, etiketinizin Tutturma özelliğini Sol, Sağ olarak ayarlayabilir ve Otomatik Boyut'u true olarak ayarlayabilirsiniz. Bu kavramsal olarak Panel'in SizeChanged
etkinliğini dinlemeye ve etiketin MaximumSize'ini bir önceki yanıtınnew Size(((Control)sender).Size.Width, 0)
önerdiği şekilde güncellemeye benzer . Anchor özelliğinde listelenen her bir taraf, içerdiği Kontrolün ilgili iç tarafına sabitlenmiştir. Dolayısıyla, Anchor'da iki zıt tarafı listelemek, kontrolün boyutunu etkili bir şekilde ayarlar. Sola ve Sağa Sabitleme, Denetimin Genişlik özelliğini ayarlar ve Üst ve Alta Sabitleme, Yükseklik özelliğini ayarlar.
Bu çözüm, C # olarak:
label.Anchor = AnchorStyles.Left | AnchorStyles.Right;
label.AutoSize = true;
Etiket genişliğini gerçekten içerikten bağımsız olarak ayarlamak istiyorsanız, en kolay yolun bu olduğunu görüyorum:
Şimdi etiket sabit genişlikte, ancak yüksekliğini otomatik olarak uyarlıyor.
Ardından dinamik metin için yazı tipi boyutunu küçültün. Gerekirse, etiket metninin ayarlandığı alt kısımda bu snippet'i kullanın:
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
Bu bana InpitWindow: In Designer for Label adlı Formumda yardımcı oldu:
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);
}
Bu sorunun basit yanıtı, Etiketin DOCK özelliğini değiştirmektir. Varsayılan olarak "NONE" dır.
Etikete önceden metin giriyorsanız, bunu yapabilirsiniz.
style="overflow:Scroll"
Etikette aşağıdaki HTML'deki gibi kullanın . Bu, kaydırma çubuğunu panel içindeki etikete ekler.
<asp:Label
ID="txtAOI"
runat="server"
style="overflow:Scroll"
CssClass="areatext"
BackColor="White"
BorderColor="Gray"
BorderWidth="1"
Width = "900" ></asp:Label>