Windows Forms 에서 레이블의 자동 줄 바꿈 기능을 어떻게 얻을 수 있습니까?
레이블을 패널에 배치하고 동적으로 레이블을 지정할 텍스트를 추가했습니다. 그러나 패널 길이를 초과합니다. 이 문제를 어떻게 해결할 수 있습니까?
답변
빠른 답변 : AutoSize 끄기 .
여기서 큰 문제는 레이블의 높이가 자동으로 변경되지 않는다는 것입니다 (너비 만). 이 권한을 얻으려면 레이블을 서브 클래 싱하고 수직 크기 조정 논리를 포함해야합니다.
기본적으로 OnPaint에서해야 할 일은 :
- 텍스트 높이 (Graphics.MeasureString)를 측정하십시오.
- 레이블 높이가 텍스트 높이와 같지 않으면 높이를 설정하고 반환하십시오.
- 텍스트를 그립니다.
또한 생성자에서 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;
여기서 우리는 상단과 하단에 대한 패딩을 처리합니다.
