【问题标题】:Strange Label AutoSize issue on TableLayoutPanel resizeTableLayoutPanel 上的奇怪标签 AutoSize 问题调整大小
【发布时间】:2013-06-21 13:23:39
【问题描述】:

背景:

我有一个TableLayoutPanel 放在UserControl 中,然后放在SplitContainer 中。以编程方式添加行。 TableLayoutPanel 锚定Top|Left|Right,所以添加行后,重新计算其高度并向下扩展。

TableLayoutPanel 内,有两列。第一列的大小为Absolute,第二列的大小设置为AutoSize

在每个单元格中,都有一个Label。第二列所有标签的定义如下:

  Label vName = new Label();
  vName.AutoSize = true;
  vName.Anchor = AnchorStyles.Left | AnchorStyles.Top | AnchorStyles.Right | AnchorStyles.Bottom;
  vName.Margin = new Padding(3);
  vName.TextAlign = ContentAlignment.MiddleLeft;
  vName.Name = "controlName";
  vName.Text = "Some text here";
  vName.DoubleClick += new EventHandler(vName_DoubleClick);
  vName.Dock = DockStyle.None;

问题:

通常,一切正常,标签调整大小和一切,除了一种奇怪的情况:

  1. 标签的文字类似于"immoballizes the device (33.33%)"TableLauoutPanel第二列的宽度是精确设置的,所以所有文字都显示在一行中。
  2. 分割器距离改变一个像素,UserControl 被调整大小:宽度减小,因此标签应该调整大小,并且标签中的文本应该换行。
  3. 标签未调整大小,第二行文本未显示,它也可能不换行(如果这样做,标签中的文本位置会发生变化)。
  4. 分割距离再次改变一个像素,UserControl 的大小被调整:宽度进一步减小。
  5. 标签大小调整正确,所有文本都显示,换行。

TableLayoutPanel 的宽度增加时也会发生同样的事情,但总是只有在存在一个像素的差异时(在环绕/不环绕文本之间)。

另外,更改标签的Dock 和/或Anchor 和/或BorderStyle 属性不起作用(我可能尝试了所有可能的组合...)

这张图稍微说明了这个问题:

【问题讨论】:

  • 我注意到您设置了Anchor 并离开了Dock = DockStyle.None...有什么原因吗? Dock 应该可以帮助解决这个问题。
  • 我一开始就试过这个。没有区别。
  • 您向布局引擎提供了相互冲突的指令。您说标签应该使用 AutoSize = true 自动调整大小。但也说它应该用 Anchor 属性观察容器的大小。这往往会导致双稳态布局,因为布局请求有 两个 解决方案。在您的情况下可能更多,因为您还使列自动调整大小。你需要摆脱这种歧义。首先敲击锚点。
  • 你说你的TableLayoutPanel是放在一个UserControl里的,那么它是怎么放置的呢? Anchor 还不够,那Dock 和它在UserControl 中的位置呢?我认为你的整个表单的屏幕截图更能描述你的问题。
  • @Hans Passant,破坏锚点没有帮助。我已经试过了。有趣的是它在所有情况下都可以正常工作,除非换行和不换行文本之间的差异正好是 1 个像素

标签: c# winforms


【解决方案1】:

显然这是一个标签问题:自动调整大小时,它没有正确测量文本,有时会有一个像素的差异。不过,我发现了一个奇怪的解决方法,如果有人知道更好的方法,请赐教。

这样,我标签中的文本每次都能正确换行,并且所有内容都会正确自动调整大小:

void tableLayoutPanel1_Resize(object sender, EventArgs e)
        {
            float fWidth = tableLayoutPanel1.GetColumnWidths()[1];
            foreach (Control ctr in tableLayoutPanel1.Controls)
            {
                if (ctr is Label && ctr.Name.Contains("vName_"))
                {
                    // -7 for margins
                    Size s = TextRenderer.MeasureText(ctr.Text, ctr.Font, new Size((int)fWidth - 7,1000),
                        TextFormatFlags.VerticalCenter 
                        | TextFormatFlags.Left 
                        | TextFormatFlags.NoPadding 
                        | TextFormatFlags.WordBreak);
                    if(!ctr.MaximumSize.Equals(s))
                        ctr.MaximumSize = new Size(s.Width, s.Height);
                }
            }
        }

【讨论】:

    猜你喜欢
    • 2015-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 2020-06-29
    相关资源
    最近更新 更多