문제

우리는 어떻게 얻는 줄 바꿈기능한 라벨 Windows Forms?

나는 배치에서 라벨에는 위원회 및 추가 텍스트를 레이블합니다.하지만 그것을 초과하는 패널의 길이입니다.어떻게 해결할 수 있는 이?

도움이 되었습니까?

해결책

빠른 답변 : 스위치 끄다 자가 크기.

여기서 가장 큰 문제는 레이블이 높이를 자동으로 변경하지 않는다는 것입니다 (너비 만). 이 올바르게 얻으려면 라벨을 서브 클래스하고 수직 크기 조정 로직을 포함해야합니다.

기본적으로 onpaint에서해야 할 일은 다음과 같습니다.

  1. 텍스트의 높이를 측정하십시오 (그래픽 .measurestring).
  2. 레이블 높이가 텍스트 높이와 같지 않은 경우 높이와 리턴을 설정합니다.
  3. 텍스트를 그립니다.

또한 설정해야합니다 재판매 로프 생성자의 스타일 플래그.

다른 팁

실제로 받아들이 대답은 불필요하게 복잡합니다.

설정하는 경우에 레이블을 자동 크기 조정,자동으로 성장떤 텍스트와 함께 당신에 넣습니다.(이 포함되어 있는 수직 성장했다.)

는 경우에 당신은 그것을 만들고 싶은 단어를 감싸서 특정 폭을 설정할 수 있습니다 maximumsize 는 제공합니다.

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

테스트 및 작동합니다.

내 경우 (패널에 레이블) 설정 label.AutoSize = false 그리고 label.Dock = Fill. 그리고 레이블 텍스트는 자동으로 래핑됩니다.

나쁜 소식 : Autowrap 속성은 없습니다.

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

이 프로그래밍 방식으로 동적으로 크기를 달성 할 수 있지만 여기에 가장 쉬운 해결책이 있습니다.

  • 레이블의 속성을 선택하십시오
  • 자가 크기 = true
  • 최대 규모 = (너비, ) 어디 너비 = 라벨을 원하는 최대 크기 및 = 포장을 원하는 픽셀 수

    Sample Properties

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

빠른 솔루션을 찾아야했기 때문에 그 속성과 함께 텍스트 상자를 사용했습니다.

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

  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

그것이 모든 사용 사례에 맞는지 확실하지 않지만 종종 랩핑 동작을 얻기 위해 간단한 트릭을 사용합니다. Label ~와 함께 AutoSize=false 1x1 내부 TableLayoutPanel 처리 할 것입니다 Label크기.

Autoellipsis 속성을 'True'로 설정하고 속성을 'False'로 설정하십시오.

enter image description here

enter image description here

패널이 레이블의 너비를 제한하는 경우 라벨의 앵커 속성을 왼쪽, 오른쪽으로 설정하고 자동 크기를 true로 설정할 수 있습니다. 이것은 개념적으로 패널의 듣기와 유사합니다. SizeChanged 이벤트 및 라벨의 최대 규모를 a로 업데이트합니다 new Size(((Control)sender).Size.Width, 0) 제안한대로 이전 답변. 앵커 속성에 나열된 모든 측면은 포함 된 제어의 각각의 내부에 고정되어 있습니다. 따라서 앵커에 두 개의 반대쪽을 나열하면 제어 차원이 효과적으로 설정됩니다. 왼쪽과 오른쪽으로 고정하면 컨트롤의 너비 속성을 설정하고 상단 및 하단으로 고정하면 높이 속성이 설정됩니다.

이 솔루션은 C#:

label.Anchor = AnchorStyles.Left | AnchorStyles.Right;
label.AutoSize = 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

이것은 Inpitwindow라는 내 형태로 : 라벨을위한 디자이너에서 :

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

내 양식의 전체 코드

버튼의 크기를 변경하지 않아야하는 경우 :

myButton.Text = "word\r\nwrapped"

이 문제에 대한 간단한 대답은 레이블의 도크 속성을 변경하는 것입니다. 기본적으로 "없음"입니다.

사용 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>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top