Windows Forms 에서 레이블의 자동 줄 바꿈 기능을 어떻게 얻을 수 있습니까?
레이블을 패널에 배치하고 동적으로 레이블을 지정할 텍스트를 추가했습니다. 그러나 패널 길이를 초과합니다. 이 문제를 어떻게 해결할 수 있습니까?
Windows Forms 에서 레이블의 자동 줄 바꿈 기능을 어떻게 얻을 수 있습니까?
레이블을 패널에 배치하고 동적으로 레이블을 지정할 텍스트를 추가했습니다. 그러나 패널 길이를 초과합니다. 이 문제를 어떻게 해결할 수 있습니까?
답변:
빠른 답변 : AutoSize 끄기 .
여기서 큰 문제는 레이블의 높이가 자동으로 변경되지 않는다는 것입니다 (너비 만). 이 권한을 얻으려면 레이블을 서브 클래 싱하고 수직 크기 조정 논리를 포함해야합니다.
기본적으로 OnPaint에서해야 할 일은 :
또한 생성자에서 ResizeRedraw 스타일 플래그 를 설정해야합니다 .
실제로 허용되는 답변은 불필요하게 복잡합니다.
레이블을 AutoSize로 설정하면 텍스트를 넣을 때마다 레이블이 자동으로 커집니다. (이것은 수직 성장을 포함합니다.)
특정 너비로 줄 바꿈하도록하려면 MaximumSize 속성을 설정할 수 있습니다.
myLabel.MaximumSize = new Size(100, 0);
myLabel.AutoSize = true;
테스트하고 작동합니다.
Dock
레이블과 패널 의 속성 을으로 설정할 수 있어야합니다 Top
.
OnResize
부모님에게 연락을 걸고 전화했다myLabel.MaximumSize = new Size(Bounds.Width, 0);
필자의 경우 (패널의 레이블) label.AutoSize = false
및을 설정했습니다 label.Dock = Fill
. 라벨 텍스트가 자동으로 줄 바꿈됩니다.
나쁜 소식 : 자동 줄 바꿈 속성이 없습니다.
좋은 소식 : 터널 끝에 빛이 있습니다!
프로그래밍 방식으로 동적으로 크기를 조정할 수 있지만 다음은 가장 쉬운 솔루션입니다.
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();
}
}
Height = sz.Height + Padding.Vertical;
)
빠른 솔루션을 찾아야했기 때문에 해당 속성과 함께 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;
여기서 우리는 상단과 하단에 대한 패딩을 처리합니다.
ClientSizeChanged event
공간을 채우는 레이블을 만들려면 패널 의 를 처리하십시오 .
private void Panel2_ClientSizeChanged(object sender, EventArgs e)
{
label1.MaximumSize = new Size((sender as Control).ClientSize.Width - label1.Left, 10000);
}
Auto-Size
라벨 설정true
Dock
라벨 설정Fill
패널에서 레이블 너비를 제한하는 경우 레이블의 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;
내용과 독립적으로 레이블 너비를 설정하려면 가장 쉬운 방법은 다음과 같습니다.
이제 레이블의 너비는 일정하지만 높이는 자동으로 조정됩니다.
그런 다음 동적 텍스트의 경우 글꼴 크기를 줄이십시오. 필요한 경우 레이블 텍스트가 설정된 하위에서이 스 니펫을 사용하십시오.
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 : 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);
}
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>