Label
如何为超出范围的文本获得自动换行功能?
19 回答
实际上,接受的答案是不必要的复杂。
如果您将标签设置为 AutoSize,它会随着您放入的任何文本自动增长。(这包括垂直增长。)
如果要使其以特定宽度自动换行,可以设置 MaximumSize 属性。
myLabel.MaximumSize = new Size(100, 0);
myLabel.AutoSize = true;
测试和工作。
快速回答:关闭 AutoSize。
这里最大的问题是标签不会自动改变它的高度(只有宽度)。要做到这一点,您需要对标签进行子类化并包括垂直调整大小逻辑。
基本上你需要在 OnPaint 中做的是:
- 测量文本的高度 (Graphics.MeasureString)。
- 如果标签高度不等于文本的高度,则设置高度并返回。
- 画出文字。
您还需要在构造函数中设置ResizeRedraw样式标志。
在我的情况下(面板上的标签)我设置label.AutoSize = false
和label.Dock = Fill
. 并且标签文本会自动换行。
没有自动换行属性,但这可以通过编程来动态调整大小。这是一种解决方案:
选择标签的属性
AutoSize
=True
MaximumSize
=(宽度,高度)其中宽度=您希望标签的最大尺寸,高度=您希望它包裹多少像素
来自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;
在这里,我们负责顶部和底部的填充。
将标签放在面板内
处理
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
除了第 2 步之外的所有操作通常都在设计器窗口中完成。
不确定它是否适合所有用例,但我经常使用一个简单的技巧来获得包装行为:将你的Label
withAutoSize=false
放在一个 1x1TableLayoutPanel
中,这将照顾Label
's 的大小。
如果按钮的尺寸需要保持不变:
myButton.Text = "word\r\nwrapped"
如果您的面板限制了标签的宽度,您可以将标签的 Anchor 属性设置为 Left、Right 并将 AutoSize 设置为 true。这在概念上类似于侦听 Panel 的SizeChanged
事件并将标签的 MaximumSize 更新为 a如先前的答案new Size(((Control)sender).Size.Width, 0)
所建议的那样。Anchor 属性中列出的每一侧都锚定到包含控件的相应内侧。所以在 Anchor 中列出两个相对的边有效地设置了控件的维度。Anchoring to Left 和 Right 设置控件的 Width 属性,而 Anchoring to Top 和 Bottom 将设置它的 Height 属性。
此解决方案,如 C#:
label.Anchor = AnchorStyles.Left | AnchorStyles.Right;
label.AutoSize = true;
如果你真的想设置独立于内容的标签宽度,我发现最简单的方法是这样的:
- 设置自动大小为真
- 将最大宽度设置为您想要的
- 相同地设置最小宽度
现在标签的宽度是恒定的,但它会自动调整其高度。
然后对于动态文本,减小字体大小。如有必要,请在设置标签文本的 sub 中使用此代码段:
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);
}
如果您事先在标签中输入文本,您可以这样做。
- 在设计器中,右键单击标签并单击属性。
- 在属性中,搜索文本选项卡。
- 单击选项卡,然后单击它旁边的箭头按钮。
- 上面会弹出一个框。
- 您可以在弹出框中按回车添加行并像在记事本中一样输入!(在您要包装标签文本的位置按 ENTER)
我有一个标签,可以在右侧停靠的自动调整大小面板中自动换行并增长到任何大小,其宽度由其他内容设置。
标签(在 tablelayoutpanel 中) Autosize = True。
TableLayoutPanel(在面板中)Autosize = True,AutoSizeMode = GrowAndShrink,Dock = Bottom,一个 Column SizeType = 100%,一个 Row SizeType = 100%。
面板(右侧停靠在表单中)AutoSize = True,AutoSizeMode = GrowAndShrink,Dock = Right。
这个问题的简单答案是更改标签的 DOCK 属性。默认为“无”。
我建议将AutoEllipsis
label 的属性设置为true
和AutoSize
to false
。如果文本长度超过标签边界,它会(...)
在末尾添加三个点,并自动将完整文本设置为工具提示。因此,用户可以通过将鼠标悬停在标签上来查看完整的文本。
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>