[C#] Windows Forms의 레이블에 대한 줄 바꿈

Windows Forms 에서 레이블의 자동 줄 바꿈 기능을 어떻게 얻을 수 있습니까?

레이블을 패널에 배치하고 동적으로 레이블을 지정할 텍스트를 추가했습니다. 그러나 패널 길이를 초과합니다. 이 문제를 어떻게 해결할 수 있습니까?



답변

빠른 답변 : AutoSize 끄기 .

여기서 큰 문제는 레이블의 높이가 자동으로 변경되지 않는다는 것입니다 (너비 만). 이 권한을 얻으려면 레이블을 서브 클래 싱하고 수직 크기 조정 논리를 포함해야합니다.

기본적으로 OnPaint에서해야 할 일은 :

  1. 텍스트 높이 (Graphics.MeasureString)를 측정하십시오.
  2. 레이블 높이가 텍스트 높이와 같지 않으면 높이를 설정하고 반환하십시오.
  3. 텍스트를 그립니다.

또한 생성자에서 ResizeRedraw 스타일 플래그 를 설정해야합니다 .


답변

실제로 허용되는 답변은 불필요하게 복잡합니다.

레이블을 AutoSize로 설정하면 텍스트를 넣을 때마다 레이블이 자동으로 커집니다. (이것은 수직 성장을 포함합니다.)

특정 너비로 ​​줄 바꿈하도록하려면 MaximumSize 속성을 설정할 수 있습니다.

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

테스트하고 작동합니다.


답변

필자의 경우 (패널의 레이블) label.AutoSize = false및을 설정했습니다 label.Dock = Fill. 라벨 텍스트가 자동으로 줄 바꿈됩니다.


답변

나쁜 소식 : 자동 줄 바꿈 속성이 없습니다.

좋은 소식 : 터널 끝에 빛이 있습니다!

프로그래밍 방식으로 동적으로 크기를 조정할 수 있지만 다음은 가장 쉬운 솔루션입니다.

  • 라벨의 속성을 선택하십시오
  • 자동 크기 = True
  • MaximumSize = ( Width , Height ) 여기서 Width = 최대 레이블 크기를 지정하고 Height = 랩핑 할 픽셀 수

    샘플 속성


답변

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


답변

빠른 솔루션을 찾아야했기 때문에 해당 속성과 함께 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
                    };


답변

@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; 여기서 우리는 상단과 하단에 대한 패딩을 처리합니다.