winform Label控件字体能否自动调整?

时间:2022-10-07 06:37:39
请问哥哥姐姐们,Label控件能不能在控件大小一定的情况下,根据要显示的字数多少来自动调整字体大小,防止文本显示不全?查了一会儿没找到。先谢谢大家了!

19 个解决方案

#1


好像是不可以的

#2


或者说有么有什么别的能显示文本的控件可以在固定大小的情况下,根据显示内容的多少调整字体呢?

#3


滚动条!!!!

#4


需要你编程序处理

#5


要么就用Enable为False的TextBox伪装一个。。。。

#6


或者什么时候字数变了一起修改Font
private void button1_Click(object sender, EventArgs e)
        {
            if (this.label1.Text == "xxx")
            {
                this.label1.Text = "xxxx";
                this.label1.Font = new Font("SimSun", 20);
            }
            else
            {
                this.label1.Text = "xxx";
                this.label1.Font = new Font("SimSun", 30);
            }

        }

#7


继承一个自己的Label,屏蔽Font属性,在Text属性中调用Graphics.MeasureString测量文本是否超长,并且调整字体。

#8


 System.Windows.Forms.TextRenderer类提供了测量和呈现文本的方法,你参考一下

#9


没有这种属性,你可以编写一个方法来实现这个功能
参考代码:
        private float chang_text_size(string s, int width,int height) 
        { 
        float size=0f;
        size = (float)((width * 1.2) / s.Length);//1.2是我自己测算出来的
        if (size > height - 3) //3也是自己测算出来的
        {
            size = height - 3;
        }
        return size;
        }

字体大小改变代码:
            this.label1.Font = new System.Drawing.Font("宋体", chang_text_size(textBox1.Text, label1.Width, label1.Height), System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128)));
测试可以实现你要求的功能

#10


引用 6 楼 UR_Not_Alone 的回复:
或者什么时候字数变了一起修改FontC# code?1234567891011121314private void button1_Click(object sender, EventArgs e)        {            if (this.label1.Text == "xxx")            {                this.lab……

谢谢您的回复,开始想过这个方法,但是后来考虑了一下觉得欠佳,因为这个Label显示的内容变化多,总不能都加判断之类的,要是以后再扩展什么的还会烦恼。

#11


引用 7 楼 caozhy 的回复:
继承一个自己的Label,屏蔽Font属性,在Text属性中调用Graphics.MeasureString测量文本是否超长,并且调整字体。

谢谢您的回复。这个获取来的SizeF是单行显示字符串时的尺寸么?因为我的Label显示多行,要是获取来的字符串尺寸是单行的话还得计算,这样似乎又麻烦了……

#12


引用 8 楼 hustliangchen 的回复:
System.Windows.Forms.TextRenderer类提供了测量和呈现文本的方法,你参考一下

谢谢您的回答!这个刚才看了下,测量来的字符串尺寸是单行显示的尺寸,但是我需要多行显示,呜呜……还在考虑

#13


如果你很较真的话,你可以反编译Label的源代码,它的自动换行就是循环算出每一行文本的溢出,然后再算下一行。你在你的程序中仿照这个过程就能算出多行文本的范围了。

#14


引用 13 楼 caozhy 的回复:
如果你很较真的话,你可以反编译Label的源代码,它的自动换行就是循环算出每一行文本的溢出,然后再算下一行。你在你的程序中仿照这个过程就能算出多行文本的范围了。

谢谢您的回答!但是我太菜了,而且只是做测试的不是开发的,目前水平很有限,不会反汇编。这个方法比较困难啊。是不是多行显示的只能自己算Label能显示多长的字符串,然后修改Font了啊?

#15


引用 14 楼 snow_1016 的回复:
引用 13 楼 caozhy 的回复:如果你很较真的话,你可以反编译Label的源代码,它的自动换行就是循环算出每一行文本的溢出,然后再算下一行。你在你的程序中仿照这个过程就能算出多行文本的范围了。
谢谢您的回答!但是我太菜了,而且只是做测试的不是开发的,目前水平很有限,不会反汇编。这个方法比较困难啊。是不是多行显示的只能自己算Label能显示多长的字符串,然后修改Fo……


用ILSpy反编译,不需要反汇编。

#16


引用 15 楼 caozhy 的回复:
引用 14 楼 snow_1016 的回复:引用 13 楼 caozhy 的回复:如果你很较真的话,你可以反编译Label的源代码,它的自动换行就是循环算出每一行文本的溢出,然后再算下一行。你在你的程序中仿照这个过程就能算出多行文本的范围了。
谢谢您的回答!但是我太菜了,而且只是做测试的不是开发的,目前水平很有限,不会反汇编。这个方法比较困难啊。是不是多行显示的只能自己……

不好意思。。看错了。。ILSpy没用过,研究下先……谢谢!

#17


我认为需要考虑一种情况:如果label中的内容足够多,里面的字体是不是小得让人看不见了?
建议用一个带滚动条的TextBox来实现;

#18


引用 17 楼 motoo 的回复:
我认为需要考虑一种情况:如果label中的内容足够多,里面的字体是不是小得让人看不见了?
建议用一个带滚动条的TextBox来实现;

谢谢您的回答,这个问题确实应该考虑到……但是刚试了,TextBox的TextAlign属性没有MiddleLeft,这样导致显示的文本都是贴着上边缘的,看上去太奇怪了。。。估计TextBox也解决不了这个问题了。。。

#19


谢谢所有为我解答的朋友。思来想去感觉通过计算字符串长度然后改变字体大小这个方法比较合理,但是鉴于多行显示造成的计算复杂程度,就没这么用...TextBox来显示的话欠美观,看着很别扭。再次感谢大家。。。。

#1


好像是不可以的

#2


或者说有么有什么别的能显示文本的控件可以在固定大小的情况下,根据显示内容的多少调整字体呢?

#3


滚动条!!!!

#4


需要你编程序处理

#5


要么就用Enable为False的TextBox伪装一个。。。。

#6


或者什么时候字数变了一起修改Font
private void button1_Click(object sender, EventArgs e)
        {
            if (this.label1.Text == "xxx")
            {
                this.label1.Text = "xxxx";
                this.label1.Font = new Font("SimSun", 20);
            }
            else
            {
                this.label1.Text = "xxx";
                this.label1.Font = new Font("SimSun", 30);
            }

        }

#7


继承一个自己的Label,屏蔽Font属性,在Text属性中调用Graphics.MeasureString测量文本是否超长,并且调整字体。

#8


 System.Windows.Forms.TextRenderer类提供了测量和呈现文本的方法,你参考一下

#9


没有这种属性,你可以编写一个方法来实现这个功能
参考代码:
        private float chang_text_size(string s, int width,int height) 
        { 
        float size=0f;
        size = (float)((width * 1.2) / s.Length);//1.2是我自己测算出来的
        if (size > height - 3) //3也是自己测算出来的
        {
            size = height - 3;
        }
        return size;
        }

字体大小改变代码:
            this.label1.Font = new System.Drawing.Font("宋体", chang_text_size(textBox1.Text, label1.Width, label1.Height), System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(128)));
测试可以实现你要求的功能

#10


引用 6 楼 UR_Not_Alone 的回复:
或者什么时候字数变了一起修改FontC# code?1234567891011121314private void button1_Click(object sender, EventArgs e)        {            if (this.label1.Text == "xxx")            {                this.lab……

谢谢您的回复,开始想过这个方法,但是后来考虑了一下觉得欠佳,因为这个Label显示的内容变化多,总不能都加判断之类的,要是以后再扩展什么的还会烦恼。

#11


引用 7 楼 caozhy 的回复:
继承一个自己的Label,屏蔽Font属性,在Text属性中调用Graphics.MeasureString测量文本是否超长,并且调整字体。

谢谢您的回复。这个获取来的SizeF是单行显示字符串时的尺寸么?因为我的Label显示多行,要是获取来的字符串尺寸是单行的话还得计算,这样似乎又麻烦了……

#12


引用 8 楼 hustliangchen 的回复:
System.Windows.Forms.TextRenderer类提供了测量和呈现文本的方法,你参考一下

谢谢您的回答!这个刚才看了下,测量来的字符串尺寸是单行显示的尺寸,但是我需要多行显示,呜呜……还在考虑

#13


如果你很较真的话,你可以反编译Label的源代码,它的自动换行就是循环算出每一行文本的溢出,然后再算下一行。你在你的程序中仿照这个过程就能算出多行文本的范围了。

#14


引用 13 楼 caozhy 的回复:
如果你很较真的话,你可以反编译Label的源代码,它的自动换行就是循环算出每一行文本的溢出,然后再算下一行。你在你的程序中仿照这个过程就能算出多行文本的范围了。

谢谢您的回答!但是我太菜了,而且只是做测试的不是开发的,目前水平很有限,不会反汇编。这个方法比较困难啊。是不是多行显示的只能自己算Label能显示多长的字符串,然后修改Font了啊?

#15


引用 14 楼 snow_1016 的回复:
引用 13 楼 caozhy 的回复:如果你很较真的话,你可以反编译Label的源代码,它的自动换行就是循环算出每一行文本的溢出,然后再算下一行。你在你的程序中仿照这个过程就能算出多行文本的范围了。
谢谢您的回答!但是我太菜了,而且只是做测试的不是开发的,目前水平很有限,不会反汇编。这个方法比较困难啊。是不是多行显示的只能自己算Label能显示多长的字符串,然后修改Fo……


用ILSpy反编译,不需要反汇编。

#16


引用 15 楼 caozhy 的回复:
引用 14 楼 snow_1016 的回复:引用 13 楼 caozhy 的回复:如果你很较真的话,你可以反编译Label的源代码,它的自动换行就是循环算出每一行文本的溢出,然后再算下一行。你在你的程序中仿照这个过程就能算出多行文本的范围了。
谢谢您的回答!但是我太菜了,而且只是做测试的不是开发的,目前水平很有限,不会反汇编。这个方法比较困难啊。是不是多行显示的只能自己……

不好意思。。看错了。。ILSpy没用过,研究下先……谢谢!

#17


我认为需要考虑一种情况:如果label中的内容足够多,里面的字体是不是小得让人看不见了?
建议用一个带滚动条的TextBox来实现;

#18


引用 17 楼 motoo 的回复:
我认为需要考虑一种情况:如果label中的内容足够多,里面的字体是不是小得让人看不见了?
建议用一个带滚动条的TextBox来实现;

谢谢您的回答,这个问题确实应该考虑到……但是刚试了,TextBox的TextAlign属性没有MiddleLeft,这样导致显示的文本都是贴着上边缘的,看上去太奇怪了。。。估计TextBox也解决不了这个问题了。。。

#19


谢谢所有为我解答的朋友。思来想去感觉通过计算字符串长度然后改变字体大小这个方法比较合理,但是鉴于多行显示造成的计算复杂程度,就没这么用...TextBox来显示的话欠美观,看着很别扭。再次感谢大家。。。。

#20