我目前正在使用的程序使用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