通过文本内容自动调整面板

时间:2016-11-02 16:38:56

标签: c# winforms

我有一个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.

所以它看起来像这样:

enter image description here

现在我需要实现的是myCustomControl的高度是根据TextContent的文本内容 - TextBox,所以我可以堆叠多个控件。因此,如果其中只有一个“Hello World”,则高度应该很小,如果我将Windows EULA放入其中它应该很长。

我已经尝试过搞乱所有“AutoSize” - 我可以动手的属性,但文本框要么完全消失,要么没有效果。

我还尝试在更改时调整文本框的大小:

Size size = TextRenderer.MeasureText(txtContent.Text, txtContent.Font);
txtContent.Height = size.Height; 

没有成功,

2 个答案:

答案 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

结果如下:

enter image description here

答案 1 :(得分:0)

如果您希望自myCustomControl进行自动调整,那么您就不能将填充停靠用于任何子控件,因为对接根据父级大小设置子级的大小,并且您希望根据子级大小调整父级大小

因此,您应该为子项使用表格布局或流程布局。如果使用表格,则必须对应适应的行使用自动大小。

然后整个布局控件可以设置为自动调整大小,并且应该停靠在顶部(或者可能是锚定的)。

如果布局控件不适合可见区域,则父级可以显示垂直滚动条。