2010-07-21 58 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