首页 > 解决方案 > C# winforms label.size 不截断标签文本

问题描述

我的标签包含从用户本地机器获得的文本——编辑——文本长度既不固定也不可预测。它是使用 VS 设计器添加到表单中的,并且 AutoSize = true。如果标签的宽度超过 260 我想切换到固定宽度/AutoEllipse。但是,当标签宽度超过最大限制时,文本不会截断文本,而是继续到表单的边缘(实际上可能超出此范围)。从我读到的MaximumSize、AutoSize 和AutoEllipse 不能一起工作。我正在使用的代码:

        string maxDesc = "Lorem ipsum dolor sit amet, consectetur adipiscing";
        int destW;
        int destWmax;

        DestNameLBL.Text = maxDesc;
        destW = DestNameLBL.Width;
        if (destW >= 260)
        {
            destWmax = 260;
            DestNameLBL.Size = new Size(destWmax, 16);
            DestNameLBL.AutoEllipsis = true;
        }
        else
        {
            DestNameLBL.AutoSize = true;
            destWmax = destW;
        }

我可以通过以编程方式创建控件来实现我的目标:

        Label destDesc = new Label();
        destDesc.Location = new Point(100, 119);
        destDesc.Text = maxDesc;
        destDesc.Font = new Font("Microsoft Sans Serif", 9.75F, FontStyle.Regular);
        if (destW >= 260)
        {
            destWmax = 260;
            destDesc.Size = new Size(destWmax, 16);
            destDesc.AutoEllipsis = true;
        }
        else
        {
            destDesc.AutoSize = true;
            destWmax = destW;
        }
        Controls.Add(destDesc);

这些代码集本质上是相同的。为什么这适用于以编程方式创建的控件,但不适用于通过设计器添加的控件(或者甚至是相关的差异化)?

标签: c#winforms

解决方案


[基于上述多条评论。]

当以编程方式将控件设置为固定大小时,在 VS 设计器中放置在表单上且 AutoSize=true 的标签不会自动覆盖 AutoSize。

它必须被显式覆盖。

在设计器中添加的控件的 AutoSize 默认值为 true,但对于“在代码中”定义的控件,默认值为 false。因此,相同的代码可能会因添加控件的方式而有所不同。

一起使用 MaximumSize 和 AutoEllipsis 将截断带有省略号的文本显示,但(在我的测试中)不会在 MouseOver 上显示包含完整文本的工具提示。

此代码适用于使用省略号和工具提示进行截断

        string maxDesc = "Lorem ipsum dolor sit amet, consectetur adipiscing elit";
        int destW;
        int destWmax;

        DestNameLBL.Text = maxDesc;
        destW = DestNameLBL.Width;
        if (destW >= 260)
        {
            destWmax = 260;
            DestNameLBL.AutoSize = false;
            DestNameLBL.Size = new Size(destWmax, 16);
            DestNameLBL.AutoEllipsis = true;
        }
        else
        {
            DestNameLBL.AutoSize = true;
            destWmax = destW;
        }

推荐阅读