【问题标题】:Determine Control's 'AutoSize'-size at runtime在运行时确定控件的“AutoSize”大小
【发布时间】:2015-04-18 19:30:33
【问题描述】:

我想在运行时布局控件(动态创建)。出于这个问题的目的,让我们限制为 Button 控件。我想设置控件的属性(如Text),然后确定控件的最小尺寸才能正常显示;设置AutoSize = true 会给出的大小。在 C# 示例代码中,GetAutoSizeSize 是这个最小大小:

Button button = new Button();
this.Controls.Add(button);

button.Text = "Example";
button.Size = GetAutoSizeSize(button);
button.Location = /* Some calculation based on button.Size */

可能的解决方案:AutoSize

可以设置button.AutoSize = truebutton.AutoSizeMode = AutoSizeNode.GrowAndShrink。之后就可以获取button.Size,之后可以关闭AutoSize,改变控件大小。

潜在问题:

  • 它看起来很奇怪,我不禁觉得这很容易打破,但也许我错了?

可能的解决方案:GetPreferredSize

button.GetPreferredSize 可用于获取控件想要的大小。

这个问题:

  • 它在内部使用和/或用于流布局。
  • GetPreferredSize 将建议的尺寸作为参数,因此需要猜测什么是合适的。
  • 返回的大小是错误的,因为它返回控件的“舒适”大小,该大小可能远大于AutoSize 给出的最小大小。

编辑: 从 cmets 和一些反复试验中,我能够得出结论,我最初使用 AutoSize 方法列出的问题是由于需要将两个控件都添加到首先是控件集合,AutoSizeMode 设置为GrowAndShrink

我想知道是否有确定 AutoSize-size 的函数(和/或更“稳健”的方式):像 GetPreferredSize 这样的函数可以返回大小而无需实际切换 AutoSize

【问题讨论】:

  • 嗯,你只是做错了。它只能在 添加到父控件集合之后自动调整大小。直到那时才能整理出诸如 dpi-awareness 和布局约束之类的基本内容。不要太相信神奇的看不见的代码会做你喜欢做的一切。
  • @HansPassant 我将示例代码修改为先添加然后计算,因为这不是问题的相关部分。
  • 不知道你想用这个来完成什么。也许你应该只使用 TableLayoutPanel。
  • 您通过编辑使问题变得荒谬,但仍然包含“等待它更新其大小”这一短语。我唯一的猜测是你仍然希望幕后的人照顾一切。 Winforms 首先投资于复制在设计时建立的布局。没有设计你的 UI 没有真正的替代品。当然没有。
  • 我的问题的全部要点是“每个控件都知道它的 AutoSize 大小;我怎样才能得到那个大小?”。不知何故,这个问题没有意义,或者我在帖子中不清楚?

标签: c# .net vb.net winforms


【解决方案1】:

这在您在控件上绘图时有效。

String sMyString = "this is my string";
Font fntFont = new Font("Arial", 8);
SizeF sfMySize = new SizeF(5,5);
sfMySize = System.Graphics.MeasureString(sMyString, fntFont, sfMySize);

这将为您提供控件文本周围的边界框的尺寸。您必须在文本周围计算出适当的缓冲区来设置按钮大小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-04
    • 2021-01-18
    • 2011-06-26
    • 2015-11-19
    • 2014-06-18
    • 1970-01-01
    • 2013-04-10
    • 2016-09-04
    相关资源
    最近更新 更多