【发布时间】:2010-07-21 16:15:56
【问题描述】:
我目前正在开发的程序使用 C# WinForms(在 2.0 .NET Framework 上,但在这种情况下可能不会有什么不同)。该设计要求能够向上和向下缩放表单及其所有控件。我通过循环遍历每个控件来做到这一点,保存它们的原始大小和位置,并获得它们与原始表单大小的比例以进行缩放。它看起来有点像这样:
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 属性而不是编写代码怎么样?
-
您是否将这些隐藏控件添加到“this”?
-
@sm Anchor and dock 仅用于重新定位代码。我还需要重新调整控件的大小(在我现在拥有的工作版本中,它们会这样做)。
-
他们有吗?我已经将控件固定在相对的两侧,并且它们按预期调整了大小。
-
@Kawa:如果你将它们锚定在相反的两侧,它们可能会扩展,但根据我的经验(我一开始就这样做了,并决定我不喜欢结果)它并不总是有效出色地。尤其是当你像我一样使用非标准控件时,它们有一堆不同的部分,不能像这样很好地缩放在一起。
标签: c# forms controls scaling hidden