各位大哥,怎么能让 Label 不还行呢?(C# WinForm)

fuyiyong 2005-07-28 06:33:48
Label 的长度不是 自动调整的,如果内容太多的话后面就不要显示了!
怎样能做到!?
...全文
287 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
cm2800118119 2005-07-30
  • 打赏
  • 举报
回复
哥们,自己重写一个Label吧!!!!
zhujiechang 2005-07-30
  • 打赏
  • 举报
回复
wuyi8808(air|skyiv.com)的代码很好啊,学习中!!!
laochai2000 2005-07-30
  • 打赏
  • 举报
回复
label纵向宽度调小一点就看不出换行拉
fuyiyong 2005-07-30
  • 打赏
  • 举报
回复
cliff1002(不得不) 理解的是对的!
可是汉字和英文字母 所占的像素不一样?
我怎么判断字符长度和label的宽度!?
fuyiyong 2005-07-30
  • 打赏
  • 举报
回复
呵呵,好的,重写!!!
谢谢!
wuyi8808 2005-07-29
  • 打赏
  • 举报
回复
// Skyiv.Windows.Forms.Label 控件, 实现了 LineLimit、Wrap 属性
namespace Skyiv.Windows.Forms
{
using System.Drawing;

class Label : System.Windows.Forms.Label
{
// 以下3个字段也可以用属性实现
public new string Text = string.Empty; // 文本
public bool LineLimit = false; // 是否仅显示完整的文本行
public bool Wrap = true; // 文本是否自动换行

// 重绘控件
protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
{
int chars, lines;
SizeF size = new SizeF(Width, Height);
StringFormatFlags sff = 0;
if (LineLimit) sff |= StringFormatFlags.LineLimit;
if (!Wrap) sff |= StringFormatFlags.NoWrap;
StringFormat sf = new StringFormat(sff);
e.Graphics.MeasureString(Text, Font, size, sf, out chars, out lines);
base.Text = Text.Substring(0, chars);
base.OnPaint(e);
}
}
}

// 测试
namespace Skyiv.Test
{
using Label = Skyiv.Windows.Forms.Label;
using System.Windows.Forms;

class Test : Form
{
Test()
{
Text = "测试字符串,很长的! 不够长? 那就再来!";

Label label1 = new Label();
label1.Parent = this;
label1.Text = Text;
label1.Width = 100;
label1.Height = 38;

Label label2 = new Label();
label2.Parent = this;
label2.Text = Text;
label2.Top = 40;
label2.Width = 100;
label2.Height = 38;
label2.LineLimit = true; // 仅显示完整的文本行

Label label3 = new Label();
label3.Parent = this;
label3.Text = Text;
label3.Top = 80;
label3.Width = 100;
label3.Height = 38;
label3.Wrap = false; // 文本不自动换行

foreach (Control ctl in Controls)
{
if (ctl is System.Windows.Forms.Label)
{
((System.Windows.Forms.Label)ctl).BorderStyle = BorderStyle.FixedSingle;
}
}
}

static void Main()
{
Application.Run(new Test());
}
}
}
wuyi8808 2005-07-29
  • 打赏
  • 举报
回复
// Skyiv.Windows.Forms.Label 控件, 实现了 LineLimit、Wrap 属性
// SLabel.cs (C) air|skyiv.com Fri 2005.07.29
namespace Skyiv.Windows.Forms
{
using System.Drawing;

class Label : System.Windows.Forms.Label
{
public new string Text = string.Empty; // 文本
public bool LineLimit = false; // 是否仅显示完整的文本行
public bool Wrap = true; // 文本是否自动换行

private string DisplayText(Graphics g)
{
StringFormat sf = new StringFormat();
if (LineLimit) sf.FormatFlags |= StringFormatFlags.LineLimit;
if (!Wrap) sf.FormatFlags |= StringFormatFlags.NoWrap;
switch (TextAlign)
{
case ContentAlignment.TopLeft :
sf.LineAlignment = StringAlignment.Near ;
sf.Alignment = StringAlignment.Near ;
break;
case ContentAlignment.TopCenter :
sf.LineAlignment = StringAlignment.Near ;
sf.Alignment = StringAlignment.Center;
break;
case ContentAlignment.TopRight :
sf.LineAlignment = StringAlignment.Near ;
sf.Alignment = StringAlignment.Far ;
break;
case ContentAlignment.MiddleLeft :
sf.LineAlignment = StringAlignment.Center;
sf.Alignment = StringAlignment.Near ;
break;
case ContentAlignment.MiddleCenter :
sf.LineAlignment = StringAlignment.Center;
sf.Alignment = StringAlignment.Center;
break;
case ContentAlignment.MiddleRight :
sf.LineAlignment = StringAlignment.Center;
sf.Alignment = StringAlignment.Far ;
break;
case ContentAlignment.BottomLeft :
sf.LineAlignment = StringAlignment.Far ;
sf.Alignment = StringAlignment.Near ;
break;
case ContentAlignment.BottomCenter :
sf.LineAlignment = StringAlignment.Far ;
sf.Alignment = StringAlignment.Center;
break;
case ContentAlignment.BottomRight :
sf.LineAlignment = StringAlignment.Far ;
sf.Alignment = StringAlignment.Far ;
break;
}
int chars, lines;
g.MeasureString(Text, Font, ClientSize, sf, out chars, out lines);
return Text.Substring(0, chars);
}

protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
{
base.Text = (Wrap && !LineLimit) ? Text : DisplayText(e.Graphics);
base.OnPaint(e);
}
}
}
wuyi8808 2005-07-28
  • 打赏
  • 举报
回复
// 使用 Skyiv.Label 可以达到多于一行的内容自动截断的效果
namespace Skyiv
{
class Label : System.Windows.Forms.Label
{
public Label()
{
BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; // 为了说明标签的边界, 使用单线边框, 正式使用时可把该行去掉.
TextAlign = System.Drawing.ContentAlignment.MiddleLeft; // System.Windows.Forms.Label的默认值是TopLeft.
}

protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
{
int charactersFitted, linesFilled;
System.Drawing.SizeF sizef = new System.Drawing.SizeF(Width, FontHeight);
System.Drawing.StringFormat stringf = new System.Drawing.StringFormat();
e.Graphics.MeasureString(Text, Font, sizef, stringf, out charactersFitted, out linesFilled);
Text = Text.Substring(0, charactersFitted);
base.OnPaint(e);
}
}
}

namespace Test
{
using MyLabel = Skyiv.Label;
using System.Windows.Forms;
using System.Drawing;

class Test : Form
{
Test()
{
MyLabel label1 = new MyLabel();
label1.Parent = this;
label1.Text = "测试字符串,很长的!还不够长?";
label1.Width = 120;
label1.Height = 60;

MyLabel label2 = new MyLabel();
label2.Parent = this;
label2.Top = 65;
label2.Width = 50;
label2.Height = 20;

MyLabel label3 = new MyLabel();
label3.Parent = this;
label3.Top = 90;
label3.Width = 155;
label3.Height = 75;
label3.Text = "测试字符串,很长的!还不够长?那就再来!";
label3.TextAlign = ContentAlignment.BottomRight;
}

static void Main()
{
Application.Run(new Test());
}
}
}
NewBo 2005-07-28
  • 打赏
  • 举报
回复
对啊!!AutoSize=false啊
zhilunchen 2005-07-28
  • 打赏
  • 举报
回复
AutoSize=false应该没有问题
oyljerry 2005-07-28
  • 打赏
  • 举报
回复
获得Label显示的宽度,然后自己截取字符串长度好了
wuyi8808 2005-07-28
  • 打赏
  • 举报
回复
可以用 Label.PreferredWidth 属性来计算文本的宽度,再与 Label.Width 属性比较来决定 Label.Text 要取多长。

cliff1002 2005-07-28
  • 打赏
  • 举报
回复
我想楼上的理解可能错了。
搂主应该是想让Label的内容不自动换行,而不是自动改变大小。

不过好像在Label成员中并没有直接提供禁止自动换行和maxlength的属性。
如果想控制的,只能通过脚本了。

首先计算label能显示的length,然后截取这部分显示出来。
可以用substring 等函数。
jkflyfox 2005-07-28
  • 打赏
  • 举报
回复
你直接拖个label就是你要的效果阿。
如果不是,你将label的AutoSize 设置为false
fuyiyong 2005-07-28
  • 打赏
  • 举报
回复
真没有人知道吗

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧