Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.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# 按文本内容自动调整面板大小_C#_.net_Winforms - Fatal编程技术网

C# 按文本内容自动调整面板大小

C# 按文本内容自动调整面板大小,c#,.net,winforms,C#,.net,Winforms,我有一个WinForms应用程序,我想在其中动态地将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.....

我有一个WinForms应用程序,我想在其中动态地将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});
现在,
myCostumControl
[YELLOW]是一个具有以下内容的用户控件:

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”,高度应该很小,如果我把窗户放进去,应该很长

我已经尝试过摆弄所有的“自动调整大小”属性,但文本框要么完全消失了,要么没有效果

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

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

没有成功,或者

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

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

然后,可以将整个布局控件设置为“自动调整大小”,并将其停靠在顶部(或者锚定)


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

要使复合控件自动调整大小,请执行以下设置:

  • 向用户控件添加一个
    标签
    ,并将标签的
    自动调整大小
    设置为false,将其高度设置为合适的高度,并将其
    停靠
    设置为顶部
  • 向用户控件添加一个
    文本框
    ,并将其
    停靠
    设置为
    填充
  • 覆盖
    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
    文本框的
    TextChanged
    事件,以在内容文本更改时刷新控件大小:

    void textBox1_TextChanged(object sender, EventArgs e)
    {
        SetBoundsCore(Left, Top, Width, Height, BoundsSpecified.Size);
    }
    
结果如下:


显然,不能同时为同一控件使用
DockStyle.Fill
AutoSize
。我还尝试了文本框使用DockStyle.Top。不起作用,但顺便说一句,
TextBox
没有任何
自动调整大小
属性。。。那么如何自动调整大小呢?自定义代码?显然,单个控件需要有一个
AutoSize
属性。。。因此,如果子控件是
文本框
,该解决方案将不起作用。您可能还想查看一下。如果您对答案有任何疑问,请告诉我:)