Word窗体中的标签换行
我们如何才能获得Windows窗体中标签的自动换行function?
我在面板中放置了一个标签,并添加了一些文本来dynamic标注。 但它超出了面板的长度。 我该如何解决这个问题?
快速回答: closures AutoSize 。
这里最大的问题是标签不会自动改变高度(只有宽度)。 为了得到这个权利,你将需要子类化标签,并包括垂直resize的逻辑。
基本上你在OnPaint中需要做的是:
- 测量文本的高度(Graphics.MeasureString)。
- 如果标签高度不等于文本的高度,则设置高度和返回值。
- 画出文字。
您还需要在构造函数中设置ResizeRedraw样式标志。
其实,接受的答案是不必要的复杂。
如果将标签设置为AutoSize,它将随着您放入的任何文本自动增长。 (这包括垂直增长。)
如果你想让它以特定的宽度换行,你可以设置MaximumSize属性。
myLabel.MaximumSize = new Size(100, 0); myLabel.AutoSize = true;
testing和工作。
在我的情况下(面板上的标签)我设置label.AutoSize = false
和label.Dock = Fill
。 标签文本自动换行。
坏消息:没有autowrap属性。
好消息:隧道尽头有灯光!
你可以通过编程实现dynamicresize,但这里是最简单的解决scheme:
- select标签的属性
- AutoSize = True
-
最大尺寸=( 宽度 , 高度 )其中宽度 =你想要的标签的最大大小, 高度 =你想要它包裹多less像素
从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(); } }
我不得不寻找一个快速的解决scheme,所以我只用了一个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
不知道它会适合所有的使用情况,但我经常使用一个简单的技巧来获得包装行为:将您的Label
AutoSize=false
在一个1×1的TableLayoutPanel
,将照顾Label
的大小。
将AutoEllipsis属性设置为“TRUE”并将AutoSize属性设置为“FALSE”。
如果您的面板限制标签的宽度,则可以将标签的“锚点”属性设置为“左”,“右”并将“AutoSize”设置为true。 这在概念上类似于侦听Panel的SizeChanged
事件,并将标签的MaximumSize更新为new Size(((Control)sender).Size.Width, 0)
如前面的回答所build议的。 列在Anchor属性中的每一面都固定在包含Control的内侧。 所以在Anchor中列举两个对立面有效地设置了控件的维度。 锚定到左侧和右侧设置控件的宽度属性和锚定顶部和底部将设置其高度属性。
这个解决scheme,如C#所示:
label.Anchor = AnchorStyles.Left | AnchorStyles.Right; label.AutoSize = true;
如果你真的想设置独立于内容的标签宽度,我发现最简单的方法是:
- 设置autosize为true
- 设置最大宽度,以你想要的
- 相同地设置最小宽度
现在标签的宽度是恒定的,但它会自动调整高度。
然后对于dynamic文本,请减小字体大小。 如有必要,请在标签文本设置的子部分使用此代码段:
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); }
我的表单的整个代码
如果button的尺寸需要保持不变:
myButton.Text = "word\r\nwrapped"
在下面的HTML中使用style="overflow:Scroll"
标签。 这将在面板中的标签中添加滚动条。
<asp:Label ID="txtAOI" runat="server" style="overflow:Scroll" CssClass="areatext" BackColor="White" BorderColor="Gray" BorderWidth="1" Width = "900" ></asp:Label>