我们如何获得Windows窗体中标签的自动换行功能?
我在面板上放置了标签,并添加了一些文本来动态标记。但是它超过了面板的长度。我该如何解决?
我们如何获得Windows窗体中标签的自动换行功能?
我在面板上放置了标签,并添加了一些文本来动态标记。但是它超过了面板的长度。我该如何解决?
Answers:
快速答案:关闭 AutoSize。
这里最大的问题是标签不会自动更改其高度(仅更改宽度)。为了实现此目的,您需要对标签进行子类化,并包括垂直调整大小逻辑。
基本上,您需要在OnPaint中执行以下操作:
您还需要在构造函数中设置ResizeRedraw样式标志。
实际上,接受的答案不必要地复杂。
如果将标签设置为“自动调整大小”,它将随输入的文本自动增长。(这包括垂直增长。)
如果要使其以特定宽度自动换行,可以设置MaximumSize属性。
myLabel.MaximumSize = new Size(100, 0);
myLabel.AutoSize = true;
经过测试和工作。
Dock
将label和panel 的属性都设置为Top
,而不是我的解决方案。
OnResize
了父母并打电话给我myLabel.MaximumSize = new Size(Bounds.Width, 0);
就我而言(面板上的标签),我设置label.AutoSize = false
和label.Dock = Fill
。标签文本将自动换行。
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。从概念上讲,这类似于侦听Panel的SizeChanged
事件并将标签的MaximumSize更新为上一个答案new Size(((Control)sender).Size.Width, 0)
所建议的。锚属性中列出的每一侧都锚定到包含控件的相应内侧。因此,在Anchor中列出两个相对的面可以有效地设置控件的尺寸。左右固定可设置控件的Width属性,上下固定可设置其Height属性。
此解决方案,如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的表单有帮助:在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);
}
此问题的简单答案是更改Label的DOCK属性。默认情况下为“ NONE”。
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>