C#,窗口窗体,最佳/最小匹配窗口内容

C#,窗口窗体,最佳/最小匹配窗口内容,c#,.net,winforms,C#,.net,Winforms,我有一个带有一些控件的窗体。(事实上,这是一个持续存在的问题。)我有的表格可以调整大小,有的不可以。无论如何,当表单显示时,最好以所需的“最小”大小显示它。其他窗口工具包,如wxWidgets(wxWindow::GetMinSize)和Qt(QWidget::minimumSize)都具有此功能 如果您不熟悉此功能,它允许窗口将自身大小调整为最小大小,这通常是所有窗口所需的,并且看起来非常漂亮。如果我有两个静态文本和两个这样布置的编辑框: Username: [ Edit/text box f

我有一个带有一些控件的窗体。(事实上,这是一个持续存在的问题。)我有的表格可以调整大小,有的不可以。无论如何,当表单显示时,最好以所需的“最小”大小显示它。其他窗口工具包,如wxWidgets(wxWindow::GetMinSize)和Qt(QWidget::minimumSize)都具有此功能

如果您不熟悉此功能,它允许窗口将自身大小调整为最小大小,这通常是所有窗口所需的,并且看起来非常漂亮。如果我有两个静态文本和两个这样布置的编辑框:

Username:
[ Edit/text box for user's password]
Password:
[ Edit/text box for user's password]
              [  Cancel  ][   OK   ]
然后我可以告诉这个表单将自己的大小调整到它的“最小大小”,它看起来就像上面的一样。(文本框中的最小宽度部分是主观的-我必须自己在一个/两个文本框中设置,但表单将查询子控件并了解最小宽度) 这通常与某种布局相结合。(这是.Net提供的。)

这还有一个额外的好处,即无论字体设置、区域设置、dpi、gui外观等如何,表单的大小都是正确的(如果操作正确,至少如此)

这在.Net中存在吗?如果存在,在哪里?如果您需要更多的描述,请询问,我很乐意提供

编辑:我要找的是上面的例子,只能在X方向调整大小(我愿意接受两者),但不能调整到小于某个W/H。控件应该锚定-即,文本框变大,按钮保持右对齐

编辑:我可以做图片!据推测,它们价值千言万语:

编辑:我想我要开始标记答案了。亨克的回答让我有了一个适合其内容的不可调整大小的对话框。下面的大多数帖子都很有价值,但没有抓住要点(除非我在这里真的偏离了基准?):我知道如何使用锚定/表格布局,以及如何让控件在那里流动——主要是让对话框的一个或两个维度与对话框的内容相适应。基本上有三种情况:

  • 对话框无法调整大小-请参阅Henk的答案。结合TableLayout和锚定,您将获得一个不错的对话框

  • 该对话框只能在一个维度中调整大小(使用1或3),您可以通过使用调整大小事件来约束维度,但对话框闪烁得很厉害。(据我所知,这似乎是Win32中的一个缺陷-有一些关于重写后台擦除的东西,它适用于控件,但不适用于windows,因为您将在窗体的后台获得工件(因为您没有擦除它们)。真正的答案是,这可能应该由Win32本身来处理-我不应该为了获得一个体面的外观而重新发明双缓冲轮…)

  • 对话框完全可以调整大小。锚和桌面布局是你的朋友。不幸的是,MinimumSize属性似乎是假的(至少,我不知道它是用来做什么的…)-例如,如果查询文本框的MinimumSize,默认情况下高度是4像素。此外,MinimumSize属性似乎没有传播-控件不会查询它的子控件。(我可以调整表单的大小,使其小于表单中的文本框,然后文本框退出表单。)如果您想知道我在胡说什么,请参阅wxWidgets以及布局和最小大小是如何工作的


  • 我还发现.Net似乎不尊重系统字体,并且总是对表单使用相同的字体,因此字体更改不会影响我的对话框(遗憾的是),这消除了我的大部分担忧(高兴的是?)。同样,请参考wxWidgets是如何实现的-如果系统字体为22pt,则所有WXframe(表单)都会尊重并适当调整大小。Net应该登上这列火车。。。(我知道有人每天使用22+pt字体作为他们的标准GUI字体。)

    听起来你想要Dock和Anchor属性


    是来自Google的第一个链接。

    有一点很接近,请尝试以下方法:将表单设计得大一点,避免右键和下键停靠控件。然后一些代码如下所示:

    private void button1_Click(object sender, EventArgs e)
    {
        this.AutoSize = true;
        this.Size = new Size(10, 10);
    }
    
    // "columnIndex" is the zero based index of the column
    this.tableLayoutPanel.ColumnStyles[columnIndex] = new ColumnStyle(SizeType.Percent, 100);
    
    // "rowIndex" is the zero based index of the row
    this.tableLayoutPanel.RowStyles[rowIndex] = new RowStyle(SizeType.Percent, 100);
    

    自动调整大小将找到控件的扩展。

    以下是我通常使用锚定处理这种情况的方法:将标签的锚定设置为顶部、左侧(默认值);顶部、左侧、右侧的文本框;和底部的按钮,对。将设计器中的窗体大小调整为所需的最小大小。在设计器中,将窗体的MinimumSize属性设置为其当前大小

    在运行时,用户可以调整窗体的大小。标签不会移动,文本框将水平拉伸,但不会垂直拉伸。按钮将随窗体的右边缘和下边缘一起移动。用户将无法创建表单(及其控件小于最小大小)


    希望这能有所帮助。

    我用电脑处理这类事情。TableLayoutPanel允许您在列和行中布局控件。列和行有三个大小类型:自动大小、百分比和绝对值。根据所需的最小值自动调整列或行的大小,根据未使用区域的百分比自动调整列或行的大小,并根据绝对像素数绝对调整列或行的大小

    VisualStudio设计器非常有用。如果您希望手工编写所有代码,那么在设计器中使用TableLayoutPanel并检查生成的设计器代码以了解如何操作TableLayoutPanel仍然是一个好主意

    为了获得所需的最小尺寸,您应该:

    • 停靠。在表单中填写TableLayoutPanel
    • 停靠。在单元格中填充控件
    • 使用Control.Margin处理控件之间的间距
    • 使所有列和行的SizeType自动调整大小
    此外,还可以使用ColumnSpan和RowSpan使控件占用多个单元格

    一旦按照您希望的方式设置了内容,就可以使用TableLayoutPanel.GetPreferredSize()来确定
    // make the form 200 pixels high, without possibility to resize the height
    // and restrict the minimum width to 200 pixels
    this.MinimumSize = new Size(200, 200);
    this.MaximumSize = new Size(30000, 200);
    
    OnLoad()
    {
        int right = this.Controls.Cast<Control>().Max(c => c.Right);
        int bottom = this.Controls.Cast<Control>().Max(c => c.Bottom);
    
        // leave a little padding, add maybe 10px or 10%?
        int minWidth = right + 10;
        int minHeight = bottom + 10;
    
        this.Size = new Size(minWidth, minHeight);
        this.MinimumSize = new Size(minWidth, minHeight);
    }