2010-07-21 55 views
0

我目前正在使用的程序使用C#WinForms(在2.0 .NET Framework上,儘管這種情況在這種情況下可能沒有什麼區別)。該設計要求能夠將表單及其所有控件上下縮放。我通過遍歷每個控件來完成此操作,保存它們的原始大小和位置,並將它們的比率與原始表單大小進行比例縮放。它看起來有點像這樣:foreach控制循環未命中隱藏的控件

const int SCALE_W = 600; 
const int SCALE_H = 500; 

... 

if (!listsBuilt){ 
    foreach (Control c in this.Controls){ 
     sizes.Add(c.Size); 
     positions.Add(c.Location); 
    } 
    listsBuilt = true; 
} 

int count = 0; 
foreach (Control c in this.Controls){ 
    c.Height = this.Height * (sizes[count].Height/SCALE_H); 
    c.Width = this.Width * (sizes[count].Width/SCALE_W); 
    c.Left = this.Width * (positions[count].X/SCALE_W); 
    c.Top = this.Height * (positions[count].Y/SCALE_H); 
} 

它是偉大的工作,到目前爲止,我已經能夠使全球並將其應用到我的所有形式。問題出現在窗體上有隱藏的對象時。我認爲他們仍然會被實例化,當程序第一次通過以獲取對象的原始大小/位置時,它會將它們拾取,但事實並非如此。如果我在表單上切換模式,並顯示一些以前不存在的對象,然後調整其大小,則對象將以錯誤的大小結束到錯誤的位置。

有沒有辦法讓我強制它在form_load上實例化隱藏的對象,即使它們還沒有顯示出來,所以這些列表在任何時候都會有適當的控制值?如果我絕對有必要,我可以做一個快速循環的開始:

foreach (Control c in this.Controls){ 
    c.Show(); 
    c.Hide(); 
} 

但它並不覺得自己是一個很好的方式去了解它。這可能會使應用程序出現明顯的閃爍或感覺到用戶放緩。任何建議都會受到歡迎(包括關於我縮放表單的方法的建議,如果這是一種特別糟糕或不雅的方式,我有點揣測我目前的方法,並有一些猜測)。

編輯:隱藏的控件通過設計器將其可見性設置爲「False」。它們在程序的稍後階段通過.Show()函數顯示。

再次編輯!:事實證明,可見性甚至不是問題。問題是,只要顯示一個控件,它似乎在控件集合中圍繞它們的索引進行混洗,所以當我回到並比較它們時,它們不是按照我第一次填充比較時的順序名單。這意味着一種控制可能會與另一種控制的價值進行比較,並最終取代它自己的位置和大小。

+0

也許我不理解你的問題,但如何使用Anchor和Dock屬性而不是編寫代碼? – 2010-07-21 16:23:24

+0

您是否將這些隱藏的控件添加到「this」? – Luiscencio 2010-07-21 16:30:19

+0

@sm錨和碼頭只能重新定位代碼。我需要控件來重新調整大小(在我現在使用的工作版本中,它們也是這樣做的)。 – KChaloux 2010-07-21 16:32:42

回答

1

爲什麼不使用TableLayoutPanel代替?我認爲他們會盡你所需,用0行代碼。

+0

TableLayoutPanel會調整控件的大小並重新定位它們嗎? – KChaloux 2010-07-21 16:35:58

+1

是 - 將'TableLayoutPanel'放置在主窗體中,然後根據需要製作任意數量的行/列。控件可以跨越具有相應'Span'屬性的多個行/列。然後將控件錨定到您希望其調整大小的單元格的邊上。例如,要有4個按鈕,每個按鈕佔據屏幕的四分之一,創建一個2x2'TableLayoutPanel',在每個按鈕中放置一個按鈕,並將每個按鈕固定到所有四邊。 – dlras2 2010-07-21 16:58:00

+0

此外,請務必將所有行和列設置爲百分比,而不是絕對大小。 (在「Edit rows/columns」對話框中)。有關更多詳細信息和示例,請參見http://msdn.microsoft.com/en-us/library/system.windows.forms.tablelayoutpanel.aspx。這是一個很棒的佈局工具。 – dlras2 2010-07-21 17:00:18

0

如果我正確理解你,你會好得多anchoring你的控制。它們將會向上和向下擴展以保持與其包含控件邊緣的距離,並且它將全部由WinForms自己爲您處理。

+0

我不認爲錨定是OP想要的;錨定維持控制邊緣與其父母之間的絕對距離,而他們正在尋找相對距離。 – dlras2 2010-07-21 16:24:18

+0

@Daniel Rasmussen:正如我所知道的那樣。現在,控件隨着窗體的大小向上和向下縮放,並且保持與窗體本身和對方相同的相對距離和比例。我實際上很早就嘗試過使用Anchor/Dock做一些縮放,但它只是沒有對我使用的一些非標準的National Instrument控件很好玩 – KChaloux 2010-07-21 16:34:29

+1

@KChaloux只是試圖自己再現你的問題,並且我在所有控件的表單加載中獲取數據,無論它們是可見的,隱藏的還是不可見的。你可以更新你的問題展示你如何隱藏控件?他們仍然在控制集合中,對嗎? – 2010-07-21 16:50:36