.Net 3.5 Winforms Basic Dialog with Label Autosize用于自定义文本内容

时间:2010-08-27 11:59:51

标签: c# winforms layout dialog

我想要一个包含以下内容的表单:

+----------------------------------------+
| Dialog Title                          X|
+----------------------------------------+
+----------------------------------------+
|icon   |                                |
|32x32px| One-line label (Heading)       |
|       +--------------------------------+
|       |                                |
|       | Message label with auto-wrap   |
|       | text according to any given    |
|       | string.                        |
+-------+--------------------------------+
| row for dialog buttons...              |
+----------------------------------------+

我很乐意回答任何问题;基本思想仍然很简单(虽然无法使其工作):给定任何包含可能换行符的消息字符串,对话框(表单)应保持其宽度,但根据消息垂直增长。

如何做到这一点?

5 个答案:

答案 0 :(得分:2)

我认为您认为最有用的组件是TableLayoutPanel。在工具箱中的“容器”下找到它。设置TableLayoutPanel的{​​{1}}。

您可以使用它来布置列和行中的控件。控件在Dock = Fill内后,您可以使用此类控件上的TableLayoutPanel属性跨多个列进行操作;我将它用于底部的按钮行,即为按钮行创建一个新面板并将按钮放在其中。当然,对于图标,请改用ColumnSpan

尝试使用某些控件的RowSpanAnchorAutoSize的各种值,尤其是您想要自动增长的邮件标签。如果您将AutoSizeModeTableLayoutPanel设置为Form,则窗口会自动随文本内容一起增长。

答案 1 :(得分:1)

您可以尝试处理标签的TextChanged事件,并使用以下内容测量字符串的大小:

Graphics g = Graphics.FromHwnd(this.Handle);
SizeF s = g.MeasureString(yourLabel.Text, yourLabel.Font, yourLabel.Width);

在此之后,了解其他控件的大小,您可以相应地修改窗口的大小。我假设您只想垂直调整窗口大小。

答案 2 :(得分:0)

为布局尝试TableLayoutPanel并将其Dock属性设置为Fill以占用整个Form。然后将“单行”和“消息”标签放入各自的单元格中,并将Dock属性设置为Fill以占据整个单元格。

如果您确实要调整整个表单的大小以适应运行时的任何消息,则可能必须使用Graphics.MeasureString来确定包含字符串所需的区域,然后调整表单大小以包含该区域。 / p>

答案 3 :(得分:-1)

您可能会尝试询问最后一个字符的位置

TextBox box = new TextBox();
box.Text = "...";
var positionOfLastCharacter = box.GetPositionFromCharIndex(box.TextLength);

您可以计算文本框和表单的必要高度。

修改:这将为您提供最后一个字符的左上角,您应该添加10px左右以使最后一行适合。

答案 4 :(得分:-2)

创建自己的新表单并将其显示为对话框。你可以把任何/你想要的东西放在那个表格上。

Here您有一个教程,将向您展示如何执行最难部分。