【问题标题】:C# winforms label.size not truncating label textC# winforms label.size 不截断标签文本
【发布时间】:2021-09-14 13:07:41
【问题描述】:

我的标签包含从用户本地机器获取的文本--编辑-,并且文本长度既不固定也不可预测。它是使用 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);

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

【问题讨论】:

  • 你好像没有关闭AutoSize
  • 我怀疑 Label 在设置 Text 属性时会立即更新其宽度。所以这行DestNameLBL.Text = maxDesc; 不会立即改变宽度。
  • AutoSize = true 由默认 LayoutEngine 应用(此 Control 在其构造函数中调用 SetSelfAutoSizeInDefaultLayout(this, true))。当您将控件添加到设计器中的容器时,它是自动。在代码中添加 Control 时,AutoSize 未应用(还没有 LayoutEngine),因此它充当 AutoSize = false
  • 只需设置MaximumSize属性。您更喜欢在设计器中这样做,这样它就会由显示器 dpi 自动缩放。
  • @Daniel - 我假设以编程方式设置 Size 会覆盖设计器属性,但显然这是无效的。显式设置 AutoSize=false 就可以了。谢谢——如果你要创建一个答案,我可以将其标记为已解决...

标签: c# winforms


【解决方案1】:

[基于以上多个cmets。]

在 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;
        }

【讨论】:

    猜你喜欢
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多