我有一个WinForms-Application,我希望将UserControls动态地插入到顶部:
this.Controls.Clear();
this.Controls.Add(myCustomControl(){Title="first", content="first text", Dock=DockStyle.Top});
this.Controls.Add(myCustomControl(){Title="second", content="very long text, where......", Dock=DockStyle.Top});
now myCostumControl
[YELLOW]是一个userControl,其内容如下:
TopTitle [PINK]: A Label, docked to the top
BottomContent [GREEN]: A Panel, Fills out the rest of the Control below the TopTitle (Dockstyle Fill)
TextContent [BLUE]: A multiline Textbox, docked (fill) within the Panel.
所以它看起来像这样:
现在我需要实现的是myCustomControl的高度是根据TextContent的文本内容 - TextBox,所以我可以堆叠多个控件。因此,如果其中只有一个“Hello World”,则高度应该很小,如果我将Windows EULA放入其中它应该很长。
我已经尝试过搞乱所有“AutoSize” - 我可以动手的属性,但文本框要么完全消失,要么没有效果。
我还尝试在更改时调整文本框的大小:
Size size = TextRenderer.MeasureText(txtContent.Text, txtContent.Font);
txtContent.Height = size.Height;
没有成功,
答案 0 :(得分:1)
要使复合控件自动调整大小,请执行以下设置:
Label
并将标签AutoSize
设置为false,并将其高度设置为合适的高度,并将其Dock
设置为顶部。TextBox
并将其Dock
设置为Fill
。覆盖SetBoundsCore
并计算首选控件大小:
protected override void SetBoundsCore(int x, int y, int width, int height,
BoundsSpecified specified)
{
var flags = TextFormatFlags.WordBreak | TextFormatFlags.NoPrefix;
var proposedSize = new Size(width, int.MaxValue);
var size = TextRenderer.MeasureText(textBox1.Text, textBox1.Font,
proposedSize, flags);
height = Math.Max(size.Height, textBox1.Font.Height) + label1.Height + 5;
base.SetBoundsCore(x, y, width, height, specified);
}
处理TextChanged
的{{1}}事件,以便在内容文字发生变化时刷新控件的大小:
TextBox
结果如下:
答案 1 :(得分:0)
如果您希望自myCustomControl
进行自动调整,那么您就不能将填充停靠用于任何子控件,因为对接根据父级大小设置子级的大小,并且您希望根据子级大小调整父级大小
因此,您应该为子项使用表格布局或流程布局。如果使用表格,则必须对应适应的行使用自动大小。
然后整个布局控件可以设置为自动调整大小,并且应该停靠在顶部(或者可能是锚定的)。
如果布局控件不适合可见区域,则父级可以显示垂直滚动条。