如何隐藏和显示表单上的面板并调整大小以消除松弛?

jma*_*ing 6 .net c# winforms

我有一个有三个面板的表格.我希望前两个是固定的高度,而底部的一个是填充剩下的空间.对话框是可调整大小的,因此所有都应该在resixze上更改宽度,而底部应该更改高度.这很重要,用户必须能够通过代码扩展表单以及程序.

如果我将面板设置为visible = false,我希望窗体高度缩小,以便其他高度保持不变.如果我将面板设置为visible = true,我希望表单高度增加面板的高度.

我将用按钮控制面板的隐藏/显示.我的想法是在我的表单中显示某些"高级"模式的面板,并将它们隐藏为"简单"模式.如果我隐藏一个面板,我不能有一堆空白,我希望表单缩小一堆简单模式.

我尝试使用停靠在顶部的面板进行此操作,但用户调整大小的表单不会更改面板高度.所以这是我要求帮助的主要技巧.

小智 7

在这种情况下,任何人都可以使用以下样式:

  1. 使用2-3面板对不同的控件进行分组,并将它们放在单个父控件中,例如GroupBox.

  2. 使所有子面板停靠在同一侧说"顶部".

  3. 如果由于类似的对接,任何面板跳过另一个面板.在Visual Studio中,转到菜单视图>其他窗口>文档大纲并设置显示顺序.(https://msdn.microsoft.com/en-us/library/46xf4h0w%28v=vs.80%29.aspx)
  4. 设置Panel属性,如下所示:AutoSize:true AutoSizeMode:GrowAndShrink

一旦面板不可见,其他面板将带走空的空间.

希望这可以帮助!!!


jma*_*ing 5

其他帖子很接近,我提出的解决方案中包含了一个细节遗漏.它是一个标志,用于判断大小的事件是由用户表单调整大小引起的,还是程序在显示或隐藏面板时执行的.

对于此解决方案,请制作包含4个面板的表单.将所有面板的底座设置为顶部.不要为面板或表单设置任何自动调整大小.同时制作两个按钮并放置在顶部面板或任何不会隐藏的面板上.

下面的代码显示了如何处理调整大小的事件以及显示隐藏按钮.我让他们隐藏/显示面板2,但代码应适用于任何面板.

namespace ProgTesting {
public partial class Form5 : Form {
private bool doNothing = false;

public Form5() {
  InitializeComponent();
  cmdAdvanced.Visible = false;
}

private void cmdSimple_Click(object sender, EventArgs e) {
  if (panel2.Visible) {
    panel2.Visible = false;
    doNothing = true;
    this.MinimumSize = new Size(this.Width, this.Height - panel2.Height);
    this.Height = this.Height - panel2.Height;
    doNothing = false;
    cmdSimple.Visible = false;
    cmdAdvanced.Visible = true;
  }
}

private void cmdAdvanced_Click(object sender, EventArgs e) {
  if (!panel2.Visible) {
    panel2.Visible = true;
    doNothing = true;
    this.Height = this.Height + panel2.Height;
    this.MinimumSize = new Size(this.Width, this.Height);
    doNothing = false;
    cmdAdvanced.Visible = false;
    cmdSimple.Visible = true;
  }
}

private void Form5_SizeChanged(object sender, EventArgs e) {
  if (!doNothing)
    if (panel2.Visible)
      panel3.Height = this.ClientSize.Height - panel1.Height - panel2.Height - panel4.Height;
    else
      panel3.Height = this.ClientSize.Height - panel1.Height - panel4.Height;
}
}
}
Run Code Online (Sandbox Code Playgroud)

你必须管理正在发生的高度,这是一种痛苦,但让你控制.它的一些镜头工作: 表格工作


jms*_*ker 1

一种方法是对顶部的两个面板使用 TableLayoutPanel。

当用户调整表单大小时,以下步骤将为您提供所需的调整大小。

  1. 首先创建一个 TableLayoutPanel (TLP),并将其从默认的 2 列、2 行缩小到仅 2 列、1 行。
  2. 将其锚定到顶部、左侧和右侧
  3. 现在调整 TLP 的大小以适合顶部两个面板,并将每个面板放置在 TLP 的单元中。
  4. 将这两个面板固定到所有侧面。
  5. 根据您的喜好将第三个面板 (Panel3) 放置在 TLP 下方,并将其固定到所有侧面。

为了处理 Panel3 的隐藏,需要将一些逻辑添加到相应的 button_Click 事件中。确定您希望“最小化”高度的大小,然后在 Panel3 可见时存储表单大小,并在再次单击时恢复高度。它应该看起来像这样。

private void button1_Click(object sender, EventArgs e)
{   
    if (panel3.Visible)
    { 
        // make invisible
        panel3.Visible = false;

        // storedHeight is a private member of the Form
        storedHeight = Form1.ActiveForm.Height;
        Form1.ActiveForm.Height = minimumHeight;  // Set to predetermined minimum height 
     }
     else
     {
         // make visible
         panel3.Visible = true;
         Form1.ActiveForm.Height = storedHeight;
     }
}
Run Code Online (Sandbox Code Playgroud)

现在,当您隐藏 Panel3 时,窗体将缩小到 TLP 的大小,然后当 Panel3 可见时再次增大。此外,顶部面板的宽度会扩大,但高度不会扩大。您将需要更改表单的 MinSize 属性,并且必须根据 Panel3 是否可见来动态调整其值。