Windows Forms'da etiket için sözcük kaydırma


184

Biri Label, sınırların dışına çıkan bir metin için sözcük kaydırma işlevini nasıl alabilir ?

Yanıtlar:


167

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:

  1. Metnin yüksekliğini ölçün (Graphics.MeasureString).
  2. Etiket yüksekliği metnin yüksekliğine eşit değilse yüksekliği ve dönüşü ayarlayın.
  3. Metni çizin.

Ayrıca yapıcıda ResizeRedraw stil bayrağını ayarlamanız gerekir .


12
Dinamik olarak metin eklediğiniz etiketi seçin. Etiketin özelliklerine bakın ve Otomatik Boyut'u kapatın. Artık etiketin alanını sürükleyebileceksiniz / ayarlayabileceksiniz ve bu parametreler dahilinde kalmak için otomatik olarak sarılacaktır. Ek kodlamaya gerek yoktur.
madeFromCode

Tam olarak aradığım şey, formumu bir paragraf formundaki açıklayıcı metinle formatlamakla ilgili.
Philip Brack

1
@madeFromCode Etiketin dikey olarak genişlemesini istiyorsanız yüksekliği programlı olarak ayarlamanız gerekir, aksi takdirde metniniz kırpılır.
Edwin

348

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.


10
Etiketin kabına yapışması varsa, Otomatik Boyutlandırmayı kapatabilir, maksimum boyut özelliğini olduğu gibi bırakabilirsiniz ve tam olarak istediğimiz gibi kelime sarır. KISS iş başında!
TheBlastOne

Bu çözelti ile sıvı genişliği elde edemezsiniz.
Robin

1
@Sam: Evet, uygun "çapa" özelliklerini ayarlayabilirsiniz. Denedin mi?
John Gietzen

1
Sam: Çözümüm yerine Dockhem etiketin hem de panelin özelliğini ayarlayabilmelisiniz Top.
John Gietzen

2
OnResizeEbeveyn ve ahizeye kilitlendimmyLabel.MaximumSize = new Size(Bounds.Width, 0);
Chris Morgan

23

Benim durumumda (paneldeki etiket) label.AutoSize = falseve ayarladım label.Dock = Fill. Ve etiket metni otomatik olarak sarılır.


Bu, etiketin tüm formu doldurmasını ve formdaki diğer tüm kontrolleri gizlemesini sağlar ... Yani, işe yaramaz gibi görünüyor. Formun tamamını doldurmayacak başka gereksinimler var mı?
Peter Mortensen

5
etiket doğrudan formda değil, bir panel üzerindedir. Bu nedenle metin panelin sınırlarını aşmaz
alex555

Tamam, ama o zaman paneldeki diğer tüm kontrolleri gizlemez mi?
Peter Mortensen

1
Yalnızca etiketi içeren fazladan bir panel oluşturmanızı engelleyen nedir?
alex555

Bu gereksiz olması gereken ekstra bir düzen gibi görünüyor. Elbette, etiketin başka bir kutuya konmak yerine kendi kutusu olmalıdır.
Edwin

17

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

    Örnek Özellikler


4
Bir not daha, maksimum yüksekliği 0 olarak bırakırsanız, dikey olarak genişlemeye devam eder.
soluk

Etiketimde Otomatik Boyut ve Maksimum Boyut özellikleri bulunmuyor, bunları nasıl ekleyebilirim?
mrbengi

11

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();
    }
}

Kelimeler yerine karakterleri kırmak için (dosya yolları gibi boşlukları olmayan uzun dizeleriniz olduğunda yararlıdır), bunun yerine (TextFormatFlags.WordBreak | TextFormatFlags.TextBoxControl) öğesini kullanın. Aynı MSDN dizisindeki son gönderiye bakın.
Ohad Schneider

1
Ayrıca, hesaplamada etiketin üst ve alt dolgusunu eklemeyi de unutmayın ( Height = sz.Height + Padding.Vertical;)
Igor Brejc

6

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
                    };

Bu iyi bir çözümdür, ancak Enable değerini false olarak ayarlamak için ReadOnly kullanmayı tercih edebilirim.
PahJoker

1
Bu, Compact Framework (Etiket'te AutoSize ve MaximumSize özelliklerinin bulunmadığı) için de iyi çalışan yaratıcı bir çözümdür.
Tim Coulter

3

@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.


1
  1. Etiketi bir panelin içine yerleştirin
  2. ClientSizeChanged eventEtiketi 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);
    }
  3. Auto-SizeEtiketi şu şekilde ayarlayın :true

  4. DockEtiketi şu şekilde ayarlayın :Fill

3. ve 4. adımlar tasarımcıda mı yapılıyor? Adım 3 ve 4 olmasının bir nedeni var mı?
Stealth Haham

Onlar tasarımcıda yapılır (ancak gerekirse kodda yapılabilir) ve sipariş için bir neden yoktur.
noelicus

1

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 Labelile AutoSize=falsebir 1x1 iç TableLayoutPanelilgilenir Label'ın boyutu.


1

AutoEllipsis Özelliğini 'TRUE' ve AutoSize Özelliğini 'FALSE' olarak ayarlayın.

resim açıklamasını buraya girin

resim açıklamasını buraya girin


0

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 SizeChangedetkinliğ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;

Çalışmıyor. Etiket, panelimin genişliğini sadece sarmak zorunda kalmayacağı şekilde arttırır. Ne yazık ki, pencere o kadar geniş değil.
ygoe

0

Etiket genişliğini gerçekten içerikten bağımsız olarak ayarlamak istiyorsanız, en kolay yolun bu olduğunu görüyorum:

  • Otomatik boyutu doğru yap
  • Maksimum genişliği istediğiniz gibi ayarlayın
  • Minimum genişliği aynı şekilde ayarlama

Ş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

0

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);
}

Formumun tüm kodu


0

Düğmenin boyutlarının değiştirilmemesi gerekiyorsa:

myButton.Text = "word\r\nwrapped"

0

Bu sorunun basit yanıtı, Etiketin DOCK özelliğini değiştirmektir. Varsayılan olarak "NONE" dır.


0

Etikete önceden metin giriyorsanız, bunu yapabilirsiniz.

  1. Tasarımcıda, etikete sağ tıklayın ve Özellikler'e tıklayın.
  2. Özellikler'de metin sekmesini arayın.
  3. Sekmeyi tıklayın ve yanındaki ok düğmesini tıklayın.
  4. Üstünde bir kutu açılır.
  5. Çizgiler eklemek ve not defterinde olduğu gibi yazmak için açılır kutuda enter tuşuna basabilirsiniz! (ETİKET METİNİNİ SARMAK İSTEDİĞİNİZ GİRİN)

-12

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>

3
Buna oy vermek iyidir, ama en azından neden yaptığını söyle. Bunun oylanmasının nedeni, WinForms'da bir <asp: Label> kullanılmamasıdır. Bu cevap yanlış platform içindir.
theJerm

4
asp.net değil winform olduğu için
Trikaldarshi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.