如何调整表单大小以自动适应其内容?

Inn*_*nno 31 .net c# winforms

我试图实现以下行为:

在表格上有一个tabcontrol.在那个tabcontrol上有一个树视图.为了防止出现滚动条,我希望表单在第一次显示时根据树视图的内容更改其大小.

如果树视图中有太多节点要显示在表单的默认大小上,则表单应更改其大小,以便树视图上没有垂直滚动条(最大为屏幕大小允许的最大大小).

我需要知道的是,是否可以通过控件的属性实现此行为.我确信这可以通过以编程方式计算和设置元素的大小来实现,但我想知道是否有办法通过AutoSizeMode等设置实现这一点.

[UPDATE]

这是我的应用程序的用户看到的第一个对话框:它是一个选择要使用的数据库的对话框.这是一个数据库列表,带有tabcontrol,buttens等.如果列表太长,则会出现滚动条,我的同事希望它们消失.

Der*_*son 26

使用AutoSize和AutoSizeMode属性.

http://msdn.microsoft.com/en-us/library/system.windows.forms.form.autosize.aspx

一个例子:

private void Form1_Load(object sender, EventArgs e)
{
    // no smaller than design time size
    this.MinimumSize = new System.Drawing.Size(this.Width, this.Height);

    // no larger than screen size
    this.MaximumSize = new System.Drawing.Size(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, (int)System.Windows.SystemParameters.PrimaryScreenHeight);

    this.AutoSize = true;
    this.AutoSizeMode = AutoSizeMode.GrowAndShrink;

    // rest of your code here...
}
Run Code Online (Sandbox Code Playgroud)

  • 我尝试过这样的事情,但我发现这种方法与对接和锚点相结合,有时会产生非常奇怪的行为.所以它本身可能工作正常,但如果你有任何对接,那么它可能不值得麻烦. (6认同)
  • System.Windows.SystemParameters已过时,无法与当前版本的.NET一起使用.考虑修改. (2认同)

Oli*_*ver 14

通过使用各种大小调整属性(Dock,Anchor)或容器控件(Panel,TableLayoutPanel,FlowLayoutPanel等),您只能指定从外部控件到内部控件的大小.但是.Net框架中没有任何(工作)允许通过子控件的大小来决定容器的大小.我也错过了几次并尝试了AutoSize属性,但它从未奏效.

所以你所能做的就是尝试手动完成这些工作,抱歉.

  • 实际上,AutoSize属性*确实*工作,但不是很好,尤其是如果您还尝试停靠或锚定任何包含的控件.WinForms通常只会在那时出现精神崩溃.您应该将容器自动调整为控件*或*将控件锚定/停靠到容器,但不要两者都停止.实际上,刮开...只是避免AutoSize.你的理智会感谢你. (3认同)
  • 同意,即使可以使用,也请避免使用自动调整大小。不使用它的另一个重要原因是因为它阻止用户在运行时手动更改表单的大小。您几乎总是希望用户能够手动控制表单的大小,如果您想自动调整表单的大小,通常会伴随一个事件,因此只需使用一些代码处理事件即可进行大小调整,而不是设置属性整个表格的行为以自动调整大小。 (2认同)

ser*_*hio 11

来自MSDN:

为了最大限度地提高工作效率,Windows窗体设计器会隐藏类的 AutoSize属性Form.在设计时,表单的行为就像AutoSize属性设置为false一样,无论其实际设置如何.在运行时,不会进行任何特殊调整,并且AutoSize属性设置指定应用属性.


Stu*_*wig 5

您可以通过计算节点的高度,将其乘以节点数,然后相应地设置表单的MinimumSize属性来计算TreeView所需的高度.

// assuming the treeview is populated!
nodeHeight = treeview1.Nodes[0].Bounds.Height;

this.MaximumSize = new Size(someMaximumWidth, someMaximumHeight);

int requiredFormHeight = (treeView1.GetNodeCount(true) * nodeHeight);

this.MinimumSize = new Size(this.Width, requiredFormHeight);
Run Code Online (Sandbox Code Playgroud)

NB.这假设treeview1是表单上唯一的控件.设置requiredFormHeight变量时,您需要允许树视图周围的其他控件和高度要求,例如您提到的tabcontrol.

(但我会同意@jgauffin并评估在未经用户同意的情况下每次加载表单时调整表单的要求背后的基本原理 - 也许让用户定位并调整表单大小并记住它而不是??)


小智 5

这可能很有用.它将新表单的大小调整为用户控件,然后将用户控件锚定到新表单:

Form f = new Form();
MyUserControl muc = new MyUserControl();
f.ClientSize = muc.Size;
f.Controls.Add(muc);
muc.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
f.ShowDialog();
Run Code Online (Sandbox Code Playgroud)