web-dev-qa-db-ja.com

Windowsフォームのラベルのワードラップ

Windowsフォーム でラベルのワードラップ機能を取得するにはどうすればよいですか?

パネルにラベルを配置し、ラベルに動的にテキストを追加しました。ただし、パネルの長さを超えています。どうすれば解決できますか?

175
Nagu

簡単な答え:switchoffAutoSize .

ここでの大きな問題は、ラベルの高さが自動的に変更されないことです(幅のみ)。これを正しく行うには、ラベルをサブクラス化し、垂直サイズ変更ロジックを含める必要があります。

基本的に、OnPaintで必要なことは次のとおりです。

  1. テキストの高さを測定します(Graphics.MeasureString)。
  2. ラベルの高さがテキストの高さと等しくない場合、高さを設定して戻ります。
  3. テキストを描画します。

また、コンストラクタで ResizeRedraw スタイルフラグを設定する必要があります。

150

実際、受け入れられた答えは不必要に複雑です。

ラベルをAutoSizeに設定すると、ラベルを入れると自動的に拡大します。 (これには垂直成長が含まれます。)

特定の幅でワードラップする場合は、MaximumSizeプロパティを設定できます。

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

テスト済みで動作します。

336
John Gietzen

私の場合(パネルのラベル)、label.AutoSize = falselabel.Dock = Fillを設定します。また、ラベルテキストは自動的に折り返されます。

21
alex555

悪いニュース:autowrapプロパティはありません。

良いニュース:トンネルの終わりにライトがあります!

プログラムでこれを達成して動的にサイズを変更することもできますが、最も簡単な解決策は次のとおりです。

  • ラベルのプロパティを選択します
  • AutoSize = True
  • MaximumSize =(高さ)ここで =ラベルにしたい最大サイズと高さ =方法あなたがそれをラップしたい多くのピクセル

    Sample Properties

16

MSDNラベル内のテキストを自動的に折り返す

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

私は簡単な解決策を見つけなければならなかったので、これらのプロパティを持つTextBoxを使用しました。

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

@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;これにより、親にドッキングしたときに自動拡張ラベルを使用できます。パネル。

this.Height = sz.Height + Padding.Bottom + Padding.Top;ここでは、上部と下部のパディングを処理します。

3
march1993

AutoEllipsisプロパティを「TRUE」に、AutoSizeプロパティを「FALSE」に設定します。

enter image description here

enter image description here

1
Ravi Kumar G N
  1. パネル内にラベルを貼ります
  2. パネルのClientSizeChanged eventを処理して、ラベルをスペースに埋めます:

    private void Panel2_ClientSizeChanged(object sender, EventArgs e)
    {
        label1.MaximumSize = new Size((sender as Control).ClientSize.Width - label1.Left, 10000);
    }
    
  3. ラベルのAuto-Sizetrueに設定します

  4. ラベルのDockFillに設定します
1
noelicus

この問題に対する簡単な答えは、ラベルのDOCKプロパティを変更することです。デフォルトでは「なし」です。

0
Sunil Neeradi

ボタンの寸法を変更せずに維持する必要がある場合:

myButton.Text = "Word\r\nwrapped"
0
rjain

コンテンツとは無関係にラベル幅を本当に設定したい場合、最も簡単な方法は次のとおりです:

  • 自動サイズをtrueに設定
  • 最大幅を希望どおりに設定します
  • 最小幅を同一に設定

ラベルの幅は一定になりましたが、高さは自動的に調整されます。

次に、ダイナミックテキストの場合、フォントサイズを小さくします。必要に応じて、ラベルテキストが設定されているサブでこのスニペットを使用します。

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
Kjell Verbeke

これはInpitWindowという名前のフォームで役立ちました。Designerfor 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);
}

フォーム全体のコード

0
Mic

パネルがラベルの幅を制限している場合、ラベルのアンカープロパティをLeft、Rightに設定し、AutoSizeをtrueに設定できます。これは、概念的には、PanelのSizeChangedイベントをリッスンし、ラベルのMaximumSizeを 前の回答 で提案されているようにnew Size(((Control)sender).Size.Width, 0)に更新することに似ています。 Anchorプロパティにリストされているすべての側は、含まれているControlのそれぞれの内側に固定されています。そのため、アンカーに2つの反対側をリストすると、コントロールの寸法が効果的に設定されます。左と右に固定すると、コントロールの幅プロパティが設定され、上と下に固定すると、高さプロパティが設定されます。

C#としてのこのソリューション:

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