Windows窗体中的标签的换行

如何为Label的文本获得换行功能,这是越界的?

196690 次浏览

简单的回答是:切换 AutoSize

这里的大问题是标签不会自动改变它的高度(只改变宽度)。要做到这一点,你需要子类化标签,并包括垂直调整大小逻辑。

基本上你需要在OnPaint中做的是:

  1. 测量文本高度(Graphics.MeasureString)。
  2. 如果标签高度不等于文本的高度,则设置高度并返回。
  3. 绘制文本。

你还需要在构造函数中设置ResizeRedraw样式标志。

MSDN自动在标签中自动换行文本 . .

事实上,公认的答案是不必要的复杂。

如果您将标签设置为“自动大小”,它将随着您放入的任何文本而自动增长。(这包括垂直增长。)

如果你想让它以特定的宽度换行,你可以设置MaximumSize属性。

myLabel.MaximumSize = new Size(100, 0);
myLabel.AutoSize = true;

测试和工作。

没有自动抓取属性,但可以通过编程来动态调整大小。这里有一个解决方案:

  • 选择标签的属性

  • AutoSize = True

  • MaximumSize = (宽度高度)其中宽度 =你想要标签的最大大小,高度 =你想要它包装多少像素

    Sample Properties

在标签中使用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>

在我的情况下(标签在面板上),我设置label.AutoSize = falselabel.Dock = Fill。 标签文本被自动换行

如果你的面板限制标签的宽度,你可以将标签的锚属性设置为左,右,并将自动大小设置为true。这在概念上类似于监听Panel的SizeChanged事件,并根据之前的回答的建议将标签的MaximumSize更新为new Size(((Control)sender).Size.Width, 0)。在Anchor属性中列出的每条边都被锚定到包含控件的各自内侧。因此,在Anchor中列出两个相对的边可以有效地设置控件的维度。左右锚定将设置控件的宽度属性,上下锚定将设置控件的高度属性。

这个解决方案,作为c#:

label.Anchor = AnchorStyles.Left | AnchorStyles.Right;
label.AutoSize = true;
  1. 将标签放在面板内

  2. 处理面板的ClientSizeChanged event,使 标签填充空格:

    private void Panel2_ClientSizeChanged(object sender, EventArgs e)
    {
    label1.MaximumSize = new Size((sender as Control).ClientSize.Width - label1.Left, 10000);
    }
    
  3. 将标签Auto-Size设置为true

  4. 将标签Dock设置为Fill

除了第2步,其他步骤通常都在设计器窗口中完成。

如果你真的想要设置标签宽度独立于内容,我发现最简单的方法是:

  • 设置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

我必须找到一个快速的解决方案,所以我只是使用了一个具有这些属性的文本框:

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
};
这帮助我在我的形式称为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);
}

< a href = " https://db。tt/b39Ndi0M" rel="nofollow">我的表单的完整代码

如果需要保持按钮尺寸不变:

myButton.Text = "word\r\nwrapped"
不确定它是否适合所有用例,但我经常使用一个简单的技巧来获得包装行为: 将你的LabelAutoSize=false放在1x1 TableLayoutPanel中,它将负责Label的大小

根据@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;这里我们关心顶部和底部的填充。

设置AutoEllipsis属性为“TRUE”,AutoSize属性为“FALSE”。

enter image description here

enter image description here

这个问题的简单答案是改变Label的DOCK属性。默认为“NONE”。

如果事先要在标签中输入文本,则可以这样做。

    在设计器中, 在标签上单击右键,单击“属性”
  1. 在“属性”中搜索文本选项卡。
  2. 单击选项卡,然后单击旁边的箭头按钮。
  3. 上面会弹出一个对话框。
  4. 你可以在弹出框中按回车键来添加行和在记事本中输入!

我建议将标签的AutoEllipsis属性设置为true,将AutoSize设置为false。如果文本长度超过标签界限,它将在结尾添加三个点(...),并自动将完整的文本设置为工具提示。因此,用户可以通过将鼠标悬停在标签上看到完整的文本。

我有一个标签,自动包装和增长到任何大小在右停靠的自动大小面板,其宽度是由其他内容设置。

标签(在tablelayoutpanel) Autosize = True。

tableelayoutpanel(在面板)Autosize = True, AutoSizeMode = GrowAndShrink, Dock =底部,一列SizeType = 100%,一行SizeType = 100%。

面板(右停靠形式)AutoSize = True, AutoSizeMode = GrowAndShrink, Dock =右。

使用System.Windows.Forms.LinkLabel代替Label,并设置属性LinkArea如下所示。

myLabel.LinkArea = new LinkArea(0, 0);