我目前正在使用的程序使用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()函數顯示。
再次編輯!:事實證明,可見性甚至不是問題。問題是,只要顯示一個控件,它似乎在控件集合中圍繞它們的索引進行混洗,所以當我回到並比較它們時,它們不是按照我第一次填充比較時的順序名單。這意味着一種控制可能會與另一種控制的價值進行比較,並最終取代它自己的位置和大小。
也許我不理解你的問題,但如何使用Anchor和Dock屬性而不是編寫代碼? – 2010-07-21 16:23:24
您是否將這些隱藏的控件添加到「this」? – Luiscencio 2010-07-21 16:30:19
@sm錨和碼頭只能重新定位代碼。我需要控件來重新調整大小(在我現在使用的工作版本中,它們也是這樣做的)。 – KChaloux 2010-07-21 16:32:42