【发布时间】: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 就可以了。谢谢——如果你要创建一个答案,我可以将其标记为已解决...