[英]How to hide and show panels on a form and have it resize to take up slack?
我有一個有三個面板的表格。 我希望前兩個是固定的高度,而底部的一個是填充剩下的空間。 對話框是可調整大小的,因此所有都應該在resixze上更改寬度,而底部應該更改高度。 這很重要,用戶必須能夠通過代碼擴展表單以及程序。
如果我將面板設置為visible = false,我希望窗體高度縮小,以便其他高度保持不變。 如果我將面板設置為visible = true,我希望表單高度增加面板的高度。
我將用按鈕控制面板的隱藏/顯示。 我的想法是在我的表單中顯示某些“高級”模式的面板,並將它們隱藏為“簡單”模式。 如果我隱藏一個面板,我不能有一堆空白,我希望表單縮小一堆簡單模式。
我嘗試使用停靠在頂部的面板進行此操作,但用戶調整大小的表單不會更改面板高度。 所以這是我要求幫助的主要技巧。
在這種情況下,任何人都可以使用以下樣式:
使用2-3面板對不同的控件進行分組,並將它們放在單個父控件中,例如GroupBox。
使所有子面板停靠在同一側說“頂部”。
一旦面板不可見,其他面板將帶走空的空間。
希望這可以幫助!!!
其他帖子很接近,我提出的解決方案中包含了一個細節遺漏。 它是一個標志,用於判斷大小的事件是由用戶表單調整大小引起的,還是程序在顯示或隱藏面板時執行的。
對於此解決方案,請制作包含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很有用,但我懷疑它們會調整它們所在容器的大小,除非你寫下我之前的調整代碼。
創建一個如下所示的表單:
然后在表單背后的代碼中:
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作為前兩個面板。
當用戶調整表單大小時,以下步驟將為您提供所需的大小調整。
要處理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.