我有一个分层系统,它使用面板来包含不同的控件和 GDI 绘图,但我想更改它们的显示顺序。我已经使用了BringToFront()
面板上的方法,这确实把它带到了前面,但是我添加到它的控件仍然显示在其他控件的后面。有没有办法也可以调出这些控件?
谢谢。
编辑:
我应该补充一点,这些面板是透明的。我将控件添加到面板中,例如panelName.Controls.Add(newControl);
您可以对面板的整个子控件集合进行排序,以更改它们的显示顺序。
Panel panel; //your top-most panel; this can be as well a Form
for (int i = 0; i < panel.Controls.Count; i++)
{
panel.Controls.SetChildIndex(
panel.Controls[i], panel.Controls.Count - 1 - i
);
}
为了使这个示例简单,集合将以相反的顺序排序,但您可以自由添加任何逻辑来计算适合您需要的新子索引。
显然,这里的关键是SetChildIndex
方法(文档),它允许您重新排列集合中的控件索引。
如果您只想对类型Panel
(或其他单一类型)的对象进行排序,那么使用 LINQ 有一种更快的方法:
List<Panel> sorted = panel.Controls.OfType<Panel>().ToList();
sorted.Sort((p1, p2) => p1.TabIndex.CompareTo(p2.TabIndex));
panel.Controls.Clear();
panel.Controls.AddRange(sorted.ToArray());
这会对所有面板进行排序,比较它们的标签索引(仅作为示例)。应该很容易为其他属性更改此设置。
另一个最常见的“错误”在于您的*.Designer.cs
-file。将控件放到窗体/面板上时,顺序可能会颠倒。只需查看您的设计器生成的文件并查看订单。
您可以循环浏览面板上的控件列表(包含在 Panel.Controls 中),并将它们也带到前面。
示例: - 假设您有一个具有 3 个按钮 b1、b2 和 b3 的面板 p1。
把 p1 放在前面,它的所有控件都是你要做的:
p1.BringToFront();
foreach(var c in p1.Controls){ c.BringToFront();}