【问题标题】:C# label size wrong when just added to container刚刚添加到容器时 C# 标签大小错误
【发布时间】:2017-08-16 08:26:38
【问题描述】:

我已经通过使用TextTenderer.MeasureText 找到了解决此问题的方法,但是我对为什么会发生这种情况感到非常困惑。我这里有一段代码:

var label = new Label() { Name = col.ColumnName, Text = col.ColumnText + ":", AutoSize = true, Margin = new Padding(1, 1, 1, 0), Font = label8.Font };
label.MaximumSize = new Size(148, 0);

Control input = null;
// Do stuff to input but not label

flowLayoutPanel2.Controls.Add(label);
flowLayoutPanel2.Controls.Add(input);
flowLayoutPanel2.Height += label.Height + input.Height + 5;

在将标签添加到 flowLayoutPanel 之前,标签的首选高度和宽度分别为 16 和 78(这很好),但添加标签后,实际高度和宽度现在是 176 和 16。我没有真的不明白176的高度是从哪里来的,但每次都是同一个数字(176)。高度应为 16,但宽度显然采用该值

在添加到面板的所有 5 个标签和 5 个其他控件中,只有添加的第二个标签(总共是第三个控件)会遇到这种情况。添加标签后,程序再次到达显示的代码段,标签的大小突然正确。

如果有人能告诉我发生了什么,将不胜感激。

【问题讨论】:

  • 代码没问题,问题肯定出在你代码的其他部分。
  • 没有其他部分对标签有任何影响,只有第二个标签会遇到这种情况。这是在 foreach 循环中运行的,并且每次都执行相同的操作。我不知道应该是什么其他部分。
  • 您显示的代码不会在此处重现该问题。当然,您不会显示循环或数据提示。
  • 我猜那只是我的电脑?显示所有循环只会增加噪音,因为它很大。你需要整个代码来理解它,而且它不是那么紧迫。我只是想知道它可能是什么:D

标签: c# controls flowlayoutpanel


【解决方案1】:

我相信这是因为当 Label 更改其父级时,它会在 AutoSize 设置为 true 时自行调整大小(取自 ReferenceSource):

protected override void OnParentChanged(EventArgs e) {
    base.OnParentChanged(e);
    if (SelfSizing) {
        // VSWhidbey 368232: in the case of SelfSizing
        // we dont know what size to be until we're parented
        AdjustSize();
    }
    Animate();
}

如果您在 FlowLayoutPanel 中放置一个标签,在 Visual Studio 设计器中也会发生同样的事情,然后您会看到它的大小将自动更新。

【讨论】:

    猜你喜欢
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    • 2011-05-22
    • 2012-10-04
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多