Windows Forms의 레이블에 대한 줄 바꿈


184

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

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

답변:


167

빠른 답변 : AutoSize 끄기 .

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

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

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

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


12
텍스트를 동적으로 추가 할 레이블을 선택하십시오. 레이블의 속성을보고 AutoSize를 끄십시오. 이제 레이블 영역을 드래그 / 설정할 수 있으며 해당 매개 변수 내에서 자동 랩핑됩니다. 추가 코딩이 필요 없습니다.
madeFromCode

이것은 단락 양식의 설명 텍스트로 양식을 형식화하는 것과 관련이 있기 때문에 내가 찾던 것입니다.
Philip Brack

1
@madeFromCode 레이블을 세로로 확장하려면 텍스트를 잘릴 수 있도록 프로그래밍 방식으로 높이를 설정해야합니다.
Edwin

348

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

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

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

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

테스트하고 작동합니다.


10
레이블을 컨테이너에 넣으면 AutoSize를 끄고 max size 속성을 그대로두고 원하는대로 정확하게 자동 줄 바꿈합니다. 직장에서 키스!
TheBlastOne

해당 솔루션으로는 유체 폭을 얻을 수 없습니다.
Robin

1
@Sam : 예, 올바른 "앵커"속성을 설정하면됩니다. 당신은 그것을 시도 했습니까?
John Gietzen

1
Sam : 내 솔루션 대신 Dock레이블과 패널 의 속성 을으로 설정할 수 있어야합니다 Top.
John Gietzen

2
나는 OnResize부모님에게 연락을 걸고 전화했다myLabel.MaximumSize = new Size(Bounds.Width, 0);
Chris Morgan

23

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


이렇게하면 레이블이 전체 양식을 채우고 양식의 다른 모든 컨트롤을 가리게됩니다 ... 즉, 작동하지 않는 것 같습니다. 전체 양식을 채우지 않는 다른 요구 사항이 있습니까?
Peter Mortensen

5
레이블 양식이 아닌 패널 에 있습니다. 따라서 텍스트는 패널 경계를 초과하지 않습니다
alex555

좋아, 그럼 패널의 다른 모든 컨트롤을 가리지 않습니까?
Peter Mortensen

1
라벨 만 포함 된 추가 패널을 만들 수없는 이유는 무엇입니까?
alex555

그것은 불필요한 추가 레이아웃처럼 보입니다. 레이블은 다른 상자에 넣을 필요없이 자체 상자를 가져야합니다.
Edwin

17

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

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

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

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

    샘플 속성


4
참고로 최대 높이를 0으로두면 세로로 계속 확장됩니다.
palehorse

라벨에 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

1
이것은 Compact Framework (Label에 AutoSize 및 MaximumSize 속성이없는)에서도 잘 작동하는 상상력있는 솔루션입니다.
Tim Coulter

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 단계 인 이유가 있습니까?
Stealth Rabbi

디자이너에서 이루어 지지만 (필요한 경우 코드에서 수행 할 수 있음) 주문할 이유가 없습니다.
noelicus

1

확실하지가 모든 사용 사례에 맞게하지만 나는 종종 포장 동작을 얻을 수있는 간단한 트릭을 사용 : 당신을 넣어 Label함께 AutoSize=false1x1 크기의 내부 TableLayoutPanel의 처리됩니다 Label의 크기입니다.



0

패널에서 레이블 너비를 제한하는 경우 레이블의 Anchor 속성을 Left, Right로 설정하고 AutoSize를 true로 설정할 수 있습니다. 이는 개념적으로 패널의 SizeChanged이벤트 를 수신 하고 이전 답변에서new Size(((Control)sender).Size.Width, 0) 제안한대로 레이블의 MaximumSize를 a 로 업데이트하는 것과 유사합니다. . Anchor 속성에 나열된 모든면은 포함하는 Control의 각면에 고정되어 있습니다. 따라서 앵커에 두 개의 반대쪽을 나열하면 컨트롤의 치수가 효과적으로 설정됩니다. 왼쪽과 오른쪽으로 고정하면 컨트롤의 너비 속성이 설정되고 위쪽과 아래쪽으로 고정하면 높이 속성이 설정됩니다.

이 솔루션은 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 : In 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

이 문제에 대한 간단한 대답은 Label의 DOCK 속성을 변경하는 것입니다. 기본적으로 "NONE"입니다.


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
이것을 거부하는 것은 좋지만, 적어도 왜 그렇게했는지 말하십시오. 이것이 투표에 실패한 이유는 <asp : Label>이 WinForms에서 사용되지 않기 때문입니다. 이 답변은 잘못된 플랫폼에 대한 것입니다.
theJerm

4
그것이 winform이 아닌 asp.net이기 때문에
Trikaldarshi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.