Frage

Wie können wir Zeilenumbruch Funktionalität für ein Label in Windows Forms bekommen?

Ich legte ein Etikett in einem Panel und fügte einen Text dynamisch zu beschriften. Aber es übersteigt die Plattenlänge. Wie kann ich dieses Problem lösen?

War es hilfreich?

Lösung

Die schnelle Antwort: Schalter Aus Auto-Size-.

Das große Problem dabei ist, dass das Etikett seine Höhe nicht automatisch (nur Breite) ändern. Um dieses Recht zu erhalten, müssen Sie das Etikett, Unterklasse und vertikale Resize-Logik enthalten.

Im Grunde, was Sie brauchen in OnPaint zu tun ist:

  1. Messen Sie die Höhe des Textes (Graphics.MeasureString).
  2. Wenn die Etikettenhöhe auf die Höhe des Textes nicht gleich ist, die Höhe und zurück gesetzt.
  3. Ziehen Sie den Text.

Sie müssen auch die ResizeRedraw Stil Flagge im Konstruktor.

Andere Tipps

Eigentlich ist die akzeptierte Antwort unnötig kompliziert.

Wenn Sie das Etikett auf Autosize gesetzt ist, wird es automatisch mit wachsen, was Text Sie in sie. (Dies schließt die vertikale Wachstum).

Wenn Sie es Zeilenumbruch an einer bestimmten Breite machen möchten, können Sie die Maximum Eigenschaft.

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

geprüft und Arbeiten.

In meinem Fall (Etikett auf einem Panel) stelle ich label.AutoSize = false und label.Dock = Fill. Und das Label Text wird automatisch umgebrochen.

Die schlechte Nachricht: Es gibt keine autowrap Eigenschaft

.

Eine gute Nachricht: es gibt ein Licht am Ende des Tunnels

Sie diese programmatisch es dynamisch Größe erreichen könnte, aber hier ist die einfachste Lösung:

  • Wählen Sie die Eigenschaften des Etiketts
  • Autosize = True
  • Maximum = ( Breite Höhe ) wobei Breite = max Größe Sie das Etikett sein wollen und Höhe = wie viele Pixel Sie wollen, es wickeln

    Beispieleigenschaften

MSDN , automatisch Text im Label-Wrap :

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

Ich hatte eine schnelle Lösung zu finden, so habe ich nur ein Text mit diesen Eigenschaften:

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

Haben Sie einen besseren basierend auf @hypo ‚s Antwort

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; diese können Sie verwenden Etikett automatisch wachsen, wenn sie einem Elternteil dockt, z.B. ein Panel.

this.Height = sz.Height + Padding.Bottom + Padding.Top; hier kümmern wir uns um Polsterung für oben und unten.

  1. Legen Sie das Etikett auf der Innenseite einer Platte
  2. Gehen Sie mit dem ClientSizeChanged event für die Platte, so dass die Etikett füllt den Raum:

    private void Panel2_ClientSizeChanged(object sender, EventArgs e)
    {
        label1.MaximumSize = new Size((sender as Control).ClientSize.Width - label1.Left, 10000);
    }
    
  3. Stellen Auto-Size für das Etikett auf true

  4. Stellen Sie Dock für das Etikett auf Fill

Nicht sicher wird es alle Anwendungsfälle passen, aber ich oft einen einfachen Trick, um das Wickelverhalten zu bekommen: setzen Sie Ihren Label mit AutoSize=false in einer 1x1 TableLayoutPanel die Pflege der Label Größe stattfinden wird.

Stellen Sie die AutoEllipsis Eigenschaft auf 'TRUE' und Auto-Size-Eigenschaft auf 'FALSE'.

Wenn Ihre Platte die Breite des Etiketts zu begrenzen, können Sie Ihr Etikett des Anchor-Eigenschaft auf links, rechts und stellen Sie Autosize auf true gesetzt. Dies ist vom Konzept her ähnlich für das Panel SizeChanged Ereignis zu hören und die Beschriftung des Maximums auf einen new Size(((Control)sender).Size.Width, 0) Aktualisierung wie von eine früheren Antwort vorgeschlagen. Jede Seite in der Anchor-Eigenschaft aufgeführt ist, gut verankert zu der Aufnahme Control jeweiliger Innenseite. So Auflistung zwei gegenüberliegende Seiten in Anchor effektiv die Dimension der Steuersätze. Verankerung nach links und rechts wird die Breite Eigenschaft Kontrolle und Verankerung nach oben und unten würde seine Height-Eigenschaft festgelegt.

Diese Lösung, wie C #:

label.Anchor = AnchorStyles.Left | AnchorStyles.Right;
label.AutoSize = true;

Wenn Sie wirklich die Etikettenbreite unabhängig vom Inhalt festgelegt werden sollen, finde ich, dass der einfachste Weg, dies ist:

  • Stellen Sie Autosize true
  • Stellen Sie maximale Breite, wie Sie es möchten
  • Stellen Sie minimale Breite identisch

Jetzt ist das Etikett mit konstanter Breite, aber sie paßt seine Höhe automatisch.

Dann für dynamischen Text, verringern Sie die Schriftgröße. Verwenden Sie bei Bedarf diese Schnipsel im Sub, wo das Etikett Text gesetzt:

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

Das half mir in meiner Form genannt InpitWindow: In Designer für 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);
}

Ganze Code meiner Form

Wenn die Abmessungen der Schaltfläche müssen gehalten werden unverändert:

myButton.Text = "word\r\nwrapped"

Die einfache Antwort für dieses Problem ist die DOCK-Eigenschaft der Label-zu ändern. Es ist „NONE“ eingestellt.

Verwenden style="overflow:Scroll" in dem Etikett, wie in der folgenden HTML. Dadurch wird die Bildlaufleiste auf dem Etikett innerhalb der Platte hinzuzufügen.

<asp:Label
    ID="txtAOI"
    runat="server"
    style="overflow:Scroll"
    CssClass="areatext"
    BackColor="White"
    BorderColor="Gray"
    BorderWidth="1"
    Width = "900" ></asp:Label>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top