【问题标题】:Hide and reShow Panels/components in Windows Forms在 Windows 窗体中隐藏和重新显示面板/组件
【发布时间】:2014-12-08 01:59:01
【问题描述】:

Initial Panels Position - image

嗨,我正在尝试做一个按钮操作来执行以下行为:

1) 当我第一次单击按钮 1 时,面板 1 将消失,面板 2 将获得父容器的大小。

2) 如果我再次单击按钮,panel1 将再次出现,panel2 将重新调整。

然后问题出在第 2 步,当我重新单击按钮 1 时,面板 2 无法很好地调整大小并得到某种固定值(检查:problem - image)。

我正在尝试这样的事情:

private void button1_Click(object sender, EventArgs e){

        if (panel1.Visible){
            panel1.Visible = false;
            panel1.Enabled = false;         
            panel2.Dock = DockStyle.Fill;
        }
        else{
            panel1.Visible = true;
            panel1.Enabled = true;
            panel2.Dock = DockStyle.None;
            panel2.Anchor = ((AnchorStyles.Top | AnchorStyles.Bottom) | AnchorStyles.Left) | AnchorStyles.Right;
        }

    }

PS:查看图片链接,可能有助于理解问题。我项目中的 panel2 也是一个 WebBrowser 组件。

谢谢。

【问题讨论】:

    标签: c# winforms panel


    【解决方案1】:

    实际上,您可能应该使用的控件是 SplitContainer 控件。

    您可以按原样使用 SplitContainer 的 Panel1 作为您的第一个 Panel,在 SplitContainer 的 Panel2 中,您可以停靠填充您的 WebBrowser 控件。

    如果面板不应该由用户调整大小,则设置

    splitContainer1.IsSplitterFixed = true;
    

    要隐藏第一个面板,您只需:

    splitContainer1.Panel1Collapsed = true;
    

    您显然将其设置为 false 以将其恢复。

    【讨论】:

    • 不完全是我想要做的,但解决了我的 panel2 没有调整大小的问题。谢谢。
    【解决方案2】:

    在运行之前,复制 panel1 的位置并将其重新发布到同一位置。示例

      if (panel1.Visible){
                panel1.Visible = false;
                panel1.Enabled = false;         
                panel2.Dock = DockStyle.Fill;
            }
            else{
                panel1.Visible = true;
                panel1.Enabled = true;
                panel2.Dock = DockStyle.None;
                panel2.Location = new Point(15, 15);
                panel2.Height= //Original height before you run.
                panel2.Anchor = ((AnchorStyles.Top | AnchorStyles.Bottom) | AnchorStyles.Left) | AnchorStyles.Right;
            }
    

    注意:新点将在您运行之前保留该位置。也尝试添加相同的高度和宽度。我认为这可能会奏效。我认为这种位置变化是由于使用了停靠属性,而仅仅取消停靠可能还不够。

    TableLayoutPanel 更新

    当我有需要动态更改的复杂控件时。在这种情况下,我建议使用 TAbleLayoutPanel。您可以将面板放在表格布局中,并将表格停靠在您想要的任何位置。您也可以将面板停靠在桌子内。然后您可以隐藏、停靠和取消停靠,您的面板将位于固定网格中,因为它位于表格中。在 youtube 上检查 TableLayoutPanel Here 或更好的 TableLAyoutPanel。希望对您有所帮助。

    【讨论】:

    • 我在您的解决方案之前尝试过,问题是我永远不会知道 panel2 的宽度和高度,因为它会根据 MainForm 的大小自动调整大小(即:如果我将窗口最大化或使用随机大小)。这样我就无法保存原始值,因为它们不是恒定的。
    • 嗨,在这种情况下使用 tableLayoutPAnel。请参阅上面的更新。将您的面板放在一个 taleLayoutpane(即)网格中。然后停靠 Table,它总是会变成你想要的形状。
    • 嗨。绝对是一个很好的解决方案。老实说,我不知道这个组件。感谢您的回复。
    【解决方案3】:

    使用splitcontainer 控件并在其panle1 和panle2 中添加面板控件。

    点击按钮集splitcontainer1.panle1.visible = truesplitcontainer1.panle2.visible=false,然后点击splitcontainer1.panle1.visible = falsesplitcontainer1.panle2.visible=true

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多