我想要一个包含以下内容的表单:
+----------------------------------------+
| Dialog Title X|
+----------------------------------------+
+----------------------------------------+
|icon | |
|32x32px| One-line label (Heading) |
| +--------------------------------+
| | |
| | Message label with auto-wrap |
| | text according to any given |
| | string. |
+-------+--------------------------------+
| row for dialog buttons... |
+----------------------------------------+
我很乐意回答任何问题;基本思想仍然很简单(虽然我无法使其工作):给定任何包含可能换行符的消息字符串,对话框(表单)应保持其宽度,但根据消息垂直增长。
如何做到这一点?
答案 0 :(得分:2)
我认为您认为最有用的组件是TableLayoutPanel
。在工具箱中的“容器”下找到它。设置TableLayoutPanel
的{{1}}。
您可以使用它来布置列和行中的控件。控件在Dock = Fill
内后,您可以使用此类控件上的TableLayoutPanel
属性跨多个列进行操作;我将它用于底部的按钮行,即为按钮行创建一个新面板并将按钮放在其中。当然,对于图标,请改用ColumnSpan
。
尝试使用某些控件的RowSpan
,Anchor
和AutoSize
的各种值,尤其是您想要自动增长的邮件标签。如果您将AutoSizeMode
和TableLayoutPanel
设置为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您有一个教程,将向您展示如何执行最难部分。