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