단어를 위한 포장에서 라벨 Windows Forms
문제
우리는 어떻게 얻는 줄 바꿈기능한 라벨 Windows Forms?
나는 배치에서 라벨에는 위원회 및 추가 텍스트를 레이블합니다.하지만 그것을 초과하는 패널의 길이입니다.어떻게 해결할 수 있는 이?
다른 팁
실제로 받아들이 대답은 불필요하게 복잡합니다.
설정하는 경우에 레이블을 자동 크기 조정,자동으로 성장떤 텍스트와 함께 당신에 넣습니다.(이 포함되어 있는 수직 성장했다.)
는 경우에 당신은 그것을 만들고 싶은 단어를 감싸서 특정 폭을 설정할 수 있습니다 maximumsize 는 제공합니다.
myLabel.MaximumSize = new Size(100, 0);
myLabel.AutoSize = true;
테스트 및 작동합니다.
내 경우 (패널에 레이블) 설정 label.AutoSize = false
그리고 label.Dock = Fill
. 그리고 레이블 텍스트는 자동으로 래핑됩니다.
나쁜 소식 : Autowrap 속성은 없습니다.
좋은 소식 : 터널 끝에 빛이 있습니다!
이 프로그래밍 방식으로 동적으로 크기를 달성 할 수 있지만 여기에 가장 쉬운 해결책이 있습니다.
- 레이블의 속성을 선택하십시오
- 자가 크기 = true
최대 규모 = (너비, 키) 어디 너비 = 라벨을 원하는 최대 크기 및 키 = 포장을 원하는 픽셀 수
에서 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;
여기서 우리는 상단과 하단의 패딩을 처리합니다.
- 라벨을 패널 안에 넣으십시오
처리
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
그것이 모든 사용 사례에 맞는지 확실하지 않지만 종종 랩핑 동작을 얻기 위해 간단한 트릭을 사용합니다. Label
~와 함께 AutoSize=false
1x1 내부 TableLayoutPanel
처리 할 것입니다 Label
크기.
패널이 레이블의 너비를 제한하는 경우 라벨의 앵커 속성을 왼쪽, 오른쪽으로 설정하고 자동 크기를 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>