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


184

Label範囲外のforテキストのワードラップ機能を取得するにはどうすればよいですか?

回答:


167

簡単な答え:AutoSizeをオフにし ます

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

基本的に、OnPaintで行う必要があるのは次のとおりです。

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

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


12
テキストを動的に追加するラベルを選択します。ラベルのプロパティを確認し、AutoSizeをオフにします。これで、ラベルの領域をドラッグ/設定できるようになり、これらのパラメーター内に留まるように自動的に自動折り返します。追加のコーディングは必要ありません。
madeFromCode

これは、段落フォームにある説明テキストを使用してフォームをフォーマットすることに関係しているため、まさに私が探していたものです。
Philip Brack 2017年

1
@madeFromCodeラベルを垂直方向に拡張する場合は、プログラムで高さを設定する必要があります。そうしないと、テキストが切り取られます。
エドウィン

348

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

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

特定の幅で折り返す場合は、MaximumSizeプロパティを設定できます。

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

テストされ、動作します。


10
コンテナーにラベルスナップがある場合は、AutoSizeをオフにして、max sizeプロパティをそのままにしておくと、希望どおりにワードラップします。仕事中のKISS!
TheBlastOne 2011年

そのソリューションでは、流体の幅を実現することはできません。
Robin

1
@サム:はい、できます。適切な「アンカー」プロパティを設定するだけです。あなたもそれを試しましたか?
John Gietzen、2012年

1
サム:私のソリューションではなくDock、ラベルとパネルの両方のプロパティをに設定できるはずTopです。
John Gietzen、2012年

2
私はOnResize親と連絡myLabel.MaximumSize = new Size(Bounds.Width, 0);
Chris Morgan

23

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


これにより、ラベルがフォーム全体を埋め、フォーム内の他のすべてのコントロールを覆い隠します...つまり、機能していないようです。フォーム全体に入力できないような他の要件はありますか?
Peter Mortensen

5
ラベル直接フォームではなくパネル上にあります。したがって、テキストはパネルの境界を超えません
alex555

わかりましたが、それではパネルの他のすべてのコントロールを覆い隠しませんか?
Peter Mortensen、2014年

1
ラベルのみを含む追加のパネルを作成できないのはなぜですか?
alex555 2014年

不要なはずの余分なレイアウトのようです。確かに、ラベルは別の箱に入れる必要があるのではなく、独自の箱を持つべきです。
エドウィン

17

autowrapプロパティはありませんが、これを動的にサイズ変更するためにプログラムで実行できます。ここに1つの解決策があります:

  • ラベルのプロパティを選択します

  • AutoSize = True

  • MaximumSize=(高さ)ここで、 =ラベルの最大サイズ、高さ =ラップするピクセル数

    サンプルプロパティ


4
もう1つ注意してください。最大の高さを0のままにすると、垂直方向に拡大し続けます。
14

ラベルにAutoSizeプロパティとMaximumSizeプロパティがありません。これらを追加するにはどうすればよいですか?
mrbengi

11

以下からの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();
    }
}

単語ではなく文字で区切るには(ファイルパスなどのスペースのない長い文字列がある場合に便利です)、代わりに(TextFormatFlags.WordBreak | TextFormatFlags.TextBoxControl)を使用します。同じMSDNスレッドの最後の投稿を参照してください。
Ohad Schneider

1
また、ラベルの上下のパディングを計算に含めることを忘れないでください(Height = sz.Height + Padding.Vertical;
Igor Brejc

6

簡単な解決策を見つける必要があったので、次のプロパティを持つ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
                    };

これは良い解決策ですが、Enabledをfalseに設定するよりもReadOnlyを使用する方がいいかもしれません。
PahJoker 2015年

1
これは、Compact Framework(LabelにAutoSizeおよびMaximumSizeプロパティがない場合)でもうまく機能する想像力豊かなソリューションです。
Tim Coulter 2016年

3

@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; ここでは、上部と下部のパディングを処理します。


1
  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-Sizeラベルに設定true

  4. Dockラベルに設定Fill

手順3と4はデザイナーで行われますか?彼らがステップ3と4である理由は何ですか?
ステルスラビ

それらはデザイナーで行われ(必要に応じてコードで行うこともできます)、注文の理由はありません。
noelicus 14年

1

わからないことは、すべてのユースケースに適合しますが、私は多くの場合、ラッピング動作を取得するために単純なトリックを使用します。あなたを置くLabelAutoSize=false1x1の内側TableLayoutPanelの世話をするLabelのサイズ。



0

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

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

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

動作しません。ラベルは、折り返す必要がないだけでパネルの幅を広げます。残念ながら、ウィンドウはそれほど広くありません。
ygoe

0

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

  • 自動サイズを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

これは、InpitWindow: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);
}

私のフォームのコード全体


0

ボタンの寸法を変更しないでおく必要がある場合:

myButton.Text = "word\r\nwrapped"


0

事前にラベルにテキストを入力している場合は、これを行うことができます。

  1. デザイナーで、ラベルを右クリックして[プロパティ]をクリックします。
  2. [プロパティ]で、テキストタブを検索します。
  3. タブをクリックして、その隣の矢印ボタンをクリックします。
  4. その上にボックスがポップアップします。
  5. ポップアップボックスでEnterキーを押して、メモ帳のように行を追加して入力できます。(ラベルのテキストを折り返したい場所でEnterキーを押してください)

-12

style="overflow:Scroll"以下のHTMLのようにラベルで使用します。これにより、パネル内のラベルにスクロールバーが追加されます。

<asp:Label
    ID="txtAOI"
    runat="server"
    style="overflow:Scroll"
    CssClass="areatext"
    BackColor="White"
    BorderColor="Gray"
    BorderWidth="1"
    Width = "900" ></asp:Label>

3
これに投票することは問題ありませんが、少なくともなぜそれをしたのかを述べてください。これが否決された理由は、WinFormsで<asp:Label>が使用されていないためです。この答えは間違ったプラットフォーム用です。
theJerm 2013

4
winformではなくasp.netであるため
Trikaldarshi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.