Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .Net 3.5 Winforms Basic对话框,带有自定义文本内容的标签自动调整大小_C#_Winforms_Layout_Dialog - Fatal编程技术网

C# .Net 3.5 Winforms Basic对话框,带有自定义文本内容的标签自动调整大小

C# .Net 3.5 Winforms Basic对话框,带有自定义文本内容的标签自动调整大小,c#,winforms,layout,dialog,C#,Winforms,Layout,Dialog,我想要一份包含以下内容的表格: +----------------------------------------+ | Dialog Title X| +----------------------------------------+ +----------------------------------------+ |icon | | |32x32px| One-line

我想要一份包含以下内容的表格:

+----------------------------------------+
| Dialog Title                          X|
+----------------------------------------+
+----------------------------------------+
|icon   |                                |
|32x32px| One-line label (Heading)       |
|       +--------------------------------+
|       |                                |
|       | Message label with auto-wrap   |
|       | text according to any given    |
|       | string.                        |
+-------+--------------------------------+
| row for dialog buttons...              |
+----------------------------------------+
我很乐意回答任何问题;基本思想仍然很简单(尽管我无法让它工作):给定任何包含可能换行符的消息字符串,对话框(一个窗体)应该保持其宽度,但根据消息垂直增长


有什么方法可以做到这一点吗?

创建自己的新表单,并将其显示为对话框。你可以在那张表格上写任何你想写的东西


您有一个教程将向您展示如何完成最难的部分。

我认为您会发现最有用的组件是
TableLayoutPanel
。在工具箱的“容器”下找到它。设置
TableLayoutPanel
Dock=Fill

您可以使用它在列和行中布局控件。控件位于
TableLayoutPanel
内后,可以使用该控件上的
ColumnSpan
属性跨越多个列;我会把它用于底部的按钮行,也就是说,为按钮行制作一个新面板,并将按钮放在其中。当然,对于图标,请改用
RowSpan

对一些控件,特别是要自动增长的消息标签,使用
Anchor
AutoSize
AutoSizeMode
的各种值进行实验。如果将
TableLayoutPanel
Form
设置为
AutoSize=true
,则窗口将随着文本内容自动增长。

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


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

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

TextBox box = new TextBox();
box.Text = "...";
var positionOfLastCharacter = box.GetPositionFromCharIndex(box.TextLength);
您可以计算文本框和表单的必要高度


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

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

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

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

而不是使用
图形。MeasureString
,使用
文本渲染器。MeasureText()
-文本渲染器提供更准确的结果(并且不需要自己创建图形对象)。此线程中的下推次数太多,不可能得到答案。请使用。