簡體   English   中英

如何隱藏和顯示表單上的面板並調整大小以消除松弛?

[英]How to hide and show panels on a form and have it resize to take up slack?

我有一個有三個面板的表格。 我希望前兩個是固定的高度,而底部的一個是填充剩下的空間。 對話框是可調整大小的,因此所有都應該在resixze上更改寬度,而底部應該更改高度。 這很重要,用戶必須能夠通過代碼擴展表單以及程序。

如果我將面板設置為visible = false,我希望窗體高度縮小,以便其他高度保持不變。 如果我將面板設置為visible = true,我希望表單高度增加面板的高度。

我將用按鈕控制面板的隱藏/顯示。 我的想法是在我的表單中顯示某些“高級”模式的面板,並將它們隱藏為“簡單”模式。 如果我隱藏一個面板,我不能有一堆空白,我希望表單縮小一堆簡單模式。

我嘗試使用停靠在頂部的面板進行此操作,但用戶調整大小的表單不會更改面板高度。 所以這是我要求幫助的主要技巧。

在這種情況下,任何人都可以使用以下樣式:

  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

一旦面板不可見,其他面板將帶走空的空間。

希望這可以幫助!!!

其他帖子很接近,我提出的解決方案中包含了一個細節遺漏。 它是一個標志,用於判斷大小的事件是由用戶表單調整大小引起的,還是程序在顯示或隱藏面板時執行的。

對於此解決方案,請制作包含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;
}
}
}

你必須管理正在發生的高度,這是一種痛苦,但讓你控制。 它的一些鏡頭工作: 表格工作

聽起來你正在尋找的是擴展器。 本質上是一個由標題和內容區域組成的控件,其中單擊標題可切換可見和折疊之間的內容區域。

如果Expander控件在展開/折疊時會自動調整窗體的高度,我並不是100%肯定。 您可能需要將事件處理程序連接到Expander,以便在Expander折疊時手動調整表單的高度。

嘗試查看Stack Overflow問題將擴展器(折疊/展開)添加到Panel WinForm 關於在Windows窗體中實現Expander的問題有許多鏈接,包括一些提供完整源代碼的鏈接。

更新:

我已經敲了一個快速的演示,它將以非常原始的方式完成你想要的東西,而不是使用任何各種Expander控件。 我認為雖然你會發現Expanders很有用,但我懷疑它們會調整它們所在容器的大小,除非你寫下我之前的調整代碼。

創建一個如下所示的表單:

可切換面板表格

  • 兩個文本框錨定為Left,Top,Right。
  • 切換按鈕錨定在Left,Top,名為btnTogglePanel。
  • 洋紅色面板錨定在左側,頂部,右側,底部,名為pnlToggled。
  • 底部按鈕固定在右側,底部。

然后在表單背后的代碼中:

public partial class ToggleableExpanderForm : Form
{
    public ToggleableExpanderForm()
    {
        InitializeComponent();
        SizeChanged += (s, args) => 
        {  
            if (_LastSize.HasValue)
            {
                var diff = Size - _LastSize.Value;
                if (_LastHeight.HasValue
                    && !IgnoreNextResizeForLastHeightAdjustment)
                {
                    _LastHeight += diff.Height;
                }
            }

            _LastSize = Size;
        };
    }

    private Size? _LastSize;
    private bool IgnoreNextResizeForLastHeightAdjustment = true;
    private int? _LastHeight;

    private void btnTogglePanel_Click(object sender, EventArgs e)
    {
        var newVisibility = !pnlToggled.Visible;
        int heightAdjustment = 0;

        if (newVisibility)
        {
            if (_LastHeight.HasValue)
            {
                heightAdjustment = _LastHeight.Value;
                _LastHeight = null;
            }
        }
        else
        {
            _LastHeight = pnlToggled.Height;
            heightAdjustment = -pnlToggled.Height;
        }

        pnlToggled.Visible = newVisibility;
        IgnoreNextResizeForLastHeightAdjustment = true;
        Height += heightAdjustment;
    }
}

實際上,根據面板是否隱藏/顯示,單擊切換按鈕時,手動調整窗體的高度。 您還需要考慮當用戶在面板不可見時調整表單大小時會發生什么,這就是聽到SizeChanged事件發生的問題。您需要回答“大小如何變化”然后根據需要調整先前存儲的面板高度。

我不認為上面的代碼是完美的,我沒有在每個用例中測試它,但它完成了基本的工作。

一種方法是使用TableLayoutPanel作為前兩個面板。

當用戶調整表單大小時,以下步驟將為您提供所需的大小調整。

  1. 首先創建一個TableLayoutPanel(TLP)並將其從默認的2列縮小,2行縮小到2列,1行。
  2. 將其錨定到頂部,左側和右側
  3. 現在調整TLP的大小以適合您的前兩個面板,並將每個面板放在TLP的單元格中。
  4. 將這兩塊面板固定在四周。
  5. 根據您的喜好將第3面板(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;
     }
}

現在,當您隱藏Panel3時,窗體將縮小到TLP的大小,然后在Panel3可見時再次增長。 頂部面板的寬度也會擴大,但不會增加高度。 您需要更改表單的MinSize屬性,並且必須根據Panel3是否可見來動態調整其值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM