C# WinForm 中Label自动换行 解决方法

From: http://hi.baidu.com/tewuapple/blog/item/74070a2451cbcc7c36a80f76.html

在TableLayoutPannel中放着一些Label

如果把Label的AutoSize属性设成True的话,文字超过label长度时就会自动增加,直到后面的字出窗体以外

设置成False时,一旦到达Label的长度,后面的字符也就显示不出来了

经过我的多番实践,最佳的解决方法是

把Label的Dock属性设置成Fill,并同时把Label的AutoSize属性设成False。

以上只是一种简便的解决方法,如果以上方法解决不了问题,就老老实实计算控件大小以适应文本吧。

-----------------------------------------------------------------

具体方法:

C# WinForm中的Label,Button等控件在布局上和Web Application中不一样。
在WebApplication中,你可以指定它们的Width属性,然后当在指定Width内显示不全时,就自动换行,自动增加其Height 属性。
在WinForm中系统不会替你做这些事情。系统要求你必须同时指定Width和Height属性,缺一不可。当一行显示完而高度不足以显示第二行时,控件上的字符就会被截断。后面的字符就不会被显示出来了。

要实现WinForm中类似于WebApp的文本自动换行功能,你就必须手动编程设置控件的高度Height。在把控件添加进Form之前,应先获得控件控件显示文本的字数sumChar=Control.Text.Length,根据字数计算出需要多少行rowCount=(numChar/每行显示字数)+1 (注意:因为当不满一行时,(int)(numChar/每行显示字数)=0,因此必须再加一),那么控件的高度就是Control.Height=rowCount*每行文本的高度

在添加控件进Form之前,加入Control.Size = new Size (控件宽度,计算出来的控件高度)

OK。

应当注意的是,由于中英文以及各种符号的宽度不一致,所以每行显示的字数很难精确计算出来。可以根据显示内容以及经验,确定一个平均值,并且在完成之后多调试,最终确定一个合适的值。

-------------------------------------------------------------------------------

1.单行完全显示:Label.AutoSize = true;

2.换行显示:Label. AutoSize = false;(Label框高度用户指定)。

3.多行显示,并且根据字数自动控制高度:Label.AutoSize = true;Label.MaximumSize = new Size(w,0); 注:w:用户设定的宽度。

------------------------------------------------------

label自动换行的折衷方案:

核心关键在于利用TextBox的MultiLine自动换行功能,实现自动换行,其他就是颜色的设置、高度及所属窗体高度的自动调整。

采用TextBox来实现文字的自动换行,textBox背景色设置为:Control色,AutoSize = true;MultiLize = true;Height = 12;

每个字符占用的宽度大约是12;

然后添加以下代码:

           int LblNum = ConfStr.Length;                                             //TextBox内容长度
           int RowNum = (int) txtBoxSp.Width/12;                               //每行显示的字数(计算出来的)
           int RowHeight = 12;                                                             //每行的高度
           int ColNum = (LblNum - (LblNum / RowNum) * RowNum) == 0 ? (LblNum / RowNum) : (LblNum / RowNum) + 1;   //列数
            
           if(ColNum == 1)
           {
               this.Height = 278;                                                   //禁止窗体显示textBox;
               this.AutoSize = false;
           }
           else
           {
               txtBoxSp.AutoSize = true;                                         //设置AutoSize
               txtBoxSp.Height = RowHeight * ColNum;                   //设置显示高度
               this.Height = 303 + txtBoxSp.Height + 6;                  //实现窗体高度的自动调整
           }

------------------------------------------------------

The fundamental problem in 1.1

When label is set to AutoSize = true, it measures as if all the text wants to be on one line.  In order to have multiple lines of text in 1.1, the AutoSize property cannot be used.

Guessing in 1.1

When you drop a label on a form in version 1.0/1.1 it is set to AutoSize = false.  The label can be resized to force the text onto the next line based upon the width of the control.  However, guessing the right height for the label can be problematic – if it is not created tall enough, the text will cut off at the bottom.  If it’s too tall there will be embarrassing gaps of whitespace in the dialog.  To solve this, folks typically used Graphics.MeasureString() with the width the label was currently set to, then used the resultant height to set the size of the label. 

There’s all kinds of problems with the latter approach – it doesn’t take into account several extra spacing/non-client borders of the control, it’s not good for performance (if you’re using Control.CreateGraphics() can force the label’s handle to be created before it normally would, etc). …and finally if you upgrade in 2.0 to UseCompatibleTextRendering = false, the calculations will be wrong.

APIs to avoid Guessing in 2.0

The Label control now has a GetPreferredSize() method which takes wrapping constraints.  This method will take out all the headaches of guessing by taking into account all the details you might not know about, e.g. non-client borders/padding and the technology used to draw text.

Having your cake and eating it too: Strategies for Automatic Word Wrap in 2.0

It was difficult to get this right in previous versions of Windows Forms, as there was no concept of constraining size.  Updating label to support multiline constraints was a delicate balancing act as we did not want to break folks using 1.1.  (A 1.1 app should *just work* running on 2.0).  If using the regular layout stuff (i.e. not flow and table layout panels) the label should continue to work as before.

The easiest way of supporting multiline text just using “dock and anchor” layout engine was to honor a new property called MaximumSize. This gives the Label a constraining width by suggesting that the maximum width you can be is “xxxx”.  When a label is AutoSize = true, it takes into account its MaximumSize when calculating its PreferredSize.

The pitfall to using MaximumSize is that the size of the label is now fixed: if you want the label to increase in width as the dialog increases, you need to write code to increase the MaximumSize.  While this is not difficult, it would be better if we could write less code.

One possibility for fixing the Label’s MaximumSize quandary is to place the label in a FlowLayoutPanel.  When a FlowLayoutPanel is anchored left|right, it has a constraining width, which it passes onto the label.  Setting the FlowLayoutPanel to AutoSize = true, the FlowLayoutPanel will grow in height as the label grows. (The label actually had a constraining width as well when anchored, but for compatibility reasons chose to ignore it.)  Because the label is in a new layout container, it is free to honor the wrapping constraints without the possibility of breaking anyone.  As the dialog is resized, the FlowLayoutPanel is resized, which in-turn passes a new constraint to the label.

Now that we have the label dynamically changing height with respect to the width of the dialog, we have another problem to solve.  If there is another control directly underneath the label, the label can obscure the control directly underneath it.  We need to find a way to push the other controls down when the label grows in height.

We could add the control below it to the FlowLayoutPanel we’ve just added, but if we want finer control of the sizing relationship, the situation calls for a TableLayoutPanel.  Controlling sizing behavior in TableLayoutPanel means controlling the ColumnStyles and RowStyles.  There are three kinds of ColumnStyles and RowStyles in the TableLayoutPanel: Percentage, Absolute and AutoSize. 

Briefly: When the TableLayoutPanel control arranges its columns, it assigns priorities to each ColumnStyle in the following order:

1. Columns with ColumnStyle set to Absolute are considered first, and their fixed widths are allocated.
2. Columns with ColumnStyle set to AutoSize are sized to their contents.
3. Remaining space is divided among columns with ColumnStyle set to Percent.

By placing a label within a column that has specific a sizing behavior, the label will wrap.  When the label wraps, controls in rows below it will be pushed down if the RowStyle is set to AutoSize.

Here’s a quick table of the behavior of labels within a TableLayoutPanel (TLP) and why they behave that way.

TLP AutoSize

TLP ColumnStyle

Will Label Wrap?

Why?

True and False

Absolute

Yes

Known constraints

Since the column is absolute, we have a known dimension to pass to the label as a wrapping distance.

True and False

AutoSize

No

Unknown constraints

Setting the column to AutoSize implies that we don’t understand currently what the size of the column should be.  Therefore all AutoSize = true controls are asked, “given infinite space, what size would you prefer to be?”

False

Percentage

Yes

Known constraints

Since the table is AutoSize = false, we understand that the % style column is a percentage of the remaining space in the table.  Therefore we have a known dimension to pass to the label as a wrapping distance.

True

Percentage

No

Unknown constraints

Since the table is AutoSize = true, we don’t understand what % should mean, as in an AutoSize = true table, there should be no free space.  In this case, the TLP reverse-engineers what the size of the column should be based on the infinite preferred size of the contents.  E.g. if a control is 50% and it says it wants to be 100px, the other 50% column should be 100px big. 

In summary:

Use label.MaximumSize if:
If you have no controls beneath your label AND your label width will remain fixed.

Use label in an anchored, autosized FlowLayoutPanel if:
If you have no controls beneath your label AND your label width will grow as a function of the dialog width.

Use label in a TableLayoutPanel if:
You have controls beneath your label that need to be moved as a function of label text length.  You will have to play with the right balance of ColumnStyles and whether or not it is necessary to actually AutoSize the TableLayoutPanel itself. 

As a last resort:
If you still cant figure it out, set label.AutoSize = false, and set the label.Size = label.GetPreferredSize( … ) with custom text wrapping constraints.

Updates:
Labels set to FlatStyle.System never word wrap when AutoSize is set to true.  Some folks use FlatStyle.System to scoot the text over to line up with the edge of the panel.  You can change your Label.Margin.Left = 0 so it will line up with other controls with a Margin.Left = 3. 

If you want Wrapping RadioButtons and CheckBoxes read here.

See the designer generated code for the samples!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/406510.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

项目最终复审报告

“北航学堂”项目最终复审报告 一、团队成员简介 Sevens团队在M1和M2阶段都是一共有七名队员,M1阶段我们的团队成员有:陈少杰,金鑫,高孟烨,雷元勇,王迪,邓亚梅,郑培蕾;在…

旁门左道也谈cacti安装

cacti作为一个优秀的流量监控软件,很多人都在用它,很多人也很想使用它。但是后面的这很多人,确没有能用上它。为啥呢?有句话说:“今天很难过,明天很难熬,后天很美好,但是很多人在明天…

js二进制流转Blob对象。Blob对象再转File对象

JavaScript 二进制转文件 使用js将blob对象转file对象 前端处理后端返回的二进制流文件 js中Blob对象一般用法 js中关于Blob对象的介绍与使用 上传的文件对象 完整代码实例 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8…

element-ui cascader 级联选择器 存最后一级id及回显

:props"{emitPath:false}" 加上这行就可以&#xff0c;只存最后一级id&#xff0c;且以最后一级id完整回显。<el-cascader expand-trigger"click" placeholder"请输入" filterable clearable:props"{emitPath:false}":options"…

freebsd点到点的ipsec ***

使用 FreeBSD 网关在两个被 Internet 分开的网络之间架设 ,以实现两个网络通过通道互访&#xff0c;IPsec 是一种建立在 Internet 协议 (IP) 层之上的协议&#xff0c;它能够让两个或更多主机以安全的方式来通讯&#xff0c;IPsec 既可以用来直接加密主机之间的网络通讯 (也就是…

怎么使用7zip进行分批压缩_怎么使用钢结构抛丸机对钢结构进行除锈?

我们生活中所见的钢结构用的时间长了以后都会产生锈渍&#xff0c;表面还会存在各种污浊物&#xff0c;所以说除锈处理是钢结构生产环节的一道主要工序&#xff0c;如果处理不好直接影响钢结构的品质和质量&#xff0c;使钢结构的维修周期缩短或影响使用寿命&#xff0c;有时会…

(简单) POJ 3984 迷宫问题,BFS。

Description 定义一个二维数组&#xff1a; int maze[5][5] {0, 1, 0, 0, 0,0, 1, 0, 1, 0,0, 0, 0, 0, 0,0, 1, 1, 1, 0,0, 0, 0, 1, 0, }; 它表示一个迷宫&#xff0c;其中的1表示墙壁&#xff0c;0表示可以走的路&#xff0c;只能横着走或竖着走&#xff0c;不能斜着走&…

一个托盘程序演示 -闹钟 Alert

From: http://www.vckbase.com/document/viewdoc/?id996 下载源代码 关键字&#xff1a;托盘 Tray   想必大家都看见过那些在系统托盘&#xff08;Tray&#xff09;中的程序吧&#xff0c;本文就演示了如何创建一个这样的托盘程序Alert。Alert是一个运行在系统托盘中的小…

adam算法效果差原因_冷库制冷效果差原因

冷库常见的现象有冷库温度降不下来和下降缓慢的时候&#xff0c;现在对库温下降缓慢的原因简单分析&#xff1a;1、冷库工程由于隔热或密封性能差&#xff0c;导致冷量损耗大隔热性能差是由于管道、库房隔热墙等的保温层厚度不够&#xff0c;隔热和保温效果不良&#xff0c;它主…

解决hive交互模式退格键乱码

在hive的交互模式下&#xff0c;输入退格、方向键等&#xff0c;出现乱码&#xff0c;可以通过如下方法解决&#xff1a; 1、修改bashrc文件&#xff1a; vi ~/.bashrc 在文件最后添加一行&#xff1a; stty erase ^H。 2、使修改生效&#xff1a; source ~/.bashrc 这样&#…

VS2010删除所有断点时不弹出提示窗口

用VS.NET平台程序时&#xff0c;如何才能在删除所有断点时不弹出提示窗口呢&#xff1f;请看下图&#xff0c;马上明白&#xff1a;

关于Eclipse基本设置(字体大小、项目导入、简单)

1、如果事先你用其他软件写好了一个项目文件夹&#xff0c;导入到Eclipse继续编辑&#xff0c;可以&#xff1a; 打开File→Import→Genral→File System→ Next &#xff0c;然后选择文件夹&#xff08;建议在导入之前&#xff0c;先建立一个工程object&#xff09; 2、字体大…

多通道_人机交互界面的多通道RGB LED驱动设计

现在的产品变得非常智能且彼此相互连接。扬声器、电视、冰箱、机顶盒和烟雾探测器等器件不再只是处在某一位置的工具 - 用户可远程或通过语音唤醒控制它们。这些器件比以前更加智能&#xff0c;这意味着它们还需要更加智慧的人机交互界面。  人机交互的界面可以多种多样&…

转,rsa算法

[编辑] 公钥和私钥的产生 假设Alice想要通过一个不可靠的媒体接收Bob的一条私人訊息。她可以用以下的方式来产生一个公钥和一个私钥&#xff1a;随意选择两个大的质数p和q&#xff0c;p不等于q&#xff0c;计算Npq。 根据歐拉函數&#xff0c;不大于N且与N互质的整数个数为(p-1…

宿舍管理系统项目管理师_2020下半年信息系统项目管理师真题——案例分析(带解析)...

2020下半年信息系统项目管理师真题——案例分析(带解析~强哥版)案例分析这次继续是计算题分析题的分布&#xff0c;但这个题由于理解上有歧义&#xff0c;所以也是大家经常争论的一个题&#xff0c;但无论第一列还是第二列对考分影响不会很大&#xff0c;所以大家还是要耐心等成…

python 计算小于某个数_python 列表寻找满足某个条件的开始索引和结束索引、区间范围...

在使用python列表的时候&#xff0c;我们经常需要找到满足某个条件的数的开始索引和结束索引&#xff0c;即满足某个条件的数的区间范围&#xff0c;本文以寻找绝对值大于等于0且小于等于3的数值区间为例&#xff0c;代码如下所示&#xff1a;这是我在做项目写python代码的时候…

Robotium编写测试用例如何模拟Junit4的BeforeClass和AfterClass方法1 - 条件判断法

Robotium的测试类ActivityInstrumentationTestCase2是继承于Junit3的TestCase类&#xff0c;所以并没有提供Junit4的特性.如网上总结说的 不能通过annotate的方式来识别子类的新特征&#xff0c;如不能实现beforeclass&#xff0c;afterclass等特征。只能通过写setup和teardown…

保姆级!!前端必会Taro入门级教学!!

我是歌谣 放弃很容易 但是坚持一定很酷 微信公众号关注前端小歌谣获取前端知识 本文将介绍 Taro 是如何从一个为了解决小程序开发问题的框架演变成一个多端统一开发框架的。 使用 React 语法来写小程序 谈一谈小程序开发 微信小程序为我们的业务提供了一种新的展现形态&…