【发布时间】:2010-10-02 00:03:54
【问题描述】:
我只是将两个网格放在一起。给定世界的一种状态,我希望网格 A 位于顶部,给定另一种世界状态,我希望网格 B 位于顶部。在过去,我们可以只调用 grid.BringToFront(),但现在已经不存在了,我想不出任何方法来实现它。
我能想到的最好的办法是,我需要创建自己的自定义类来实现此功能,但这对于曾经如此简单的东西来说似乎是一种过分的做法。
【问题讨论】:
我只是将两个网格放在一起。给定世界的一种状态,我希望网格 A 位于顶部,给定另一种世界状态,我希望网格 B 位于顶部。在过去,我们可以只调用 grid.BringToFront(),但现在已经不存在了,我想不出任何方法来实现它。
我能想到的最好的办法是,我需要创建自己的自定义类来实现此功能,但这对于曾经如此简单的东西来说似乎是一种过分的做法。
【问题讨论】:
您可以使用Panel.ZIndex 属性更改面板中元素的显示顺序
【讨论】:
你必须使用 Z 索引属性,因为没有内置函数来做你想做的事,所以我自己做了。 Z 值越高,越靠近控件前方。 因此,您希望无需设置任意高 Z 值即可将控件放在首位。
所以这是我为自己编写的一个小函数来完成这个任务。 注意:这假设您使用的是 Canvas 和 UserControls。 所以如果不是你的情况,你可能需要稍微调整一下。
基本上它将获取要移动的控件的索引,然后当前位于其上方的任何控件将下降 1,并且要移动的控件将放在顶部(以保持层次结构)。
static public void BringToFront(Canvas pParent, UserControl pToMove)
{
try
{
int currentIndex = Canvas.GetZIndex(pToMove);
int zIndex = 0;
int maxZ = 0;
UserControl child;
for (int i = 0; i < pParent.Children.Count; i++)
{
if (pParent.Children[i] is UserControl &&
pParent.Children[i] != pToMove)
{
child = pParent.Children[i] as UserControl;
zIndex = Canvas.GetZIndex(child);
maxZ = Math.Max(maxZ, zIndex);
if (zIndex > currentIndex)
{
Canvas.SetZIndex(child, zIndex - 1);
}
}
}
Canvas.SetZIndex(pToMove, maxZ);
}
catch (Exception ex)
{
}
}
【讨论】:
可能涉及的人员:
ZIndex 属性默认为 0,所以如果你(像我一样)有超过 1 个元素的画布(在我的例子中是 >4000 个形状),所有的都会有ZIndex = 0,所以用这个方法改变 ZIndexes不会有任何影响。
为此,我在创建所有元素后将 ZIndexes 设置为一个已知值,以便它们可以在之后排序。
int zIndex = 0;
for (int i = 0; i < canvas.Children.Count; i++) {
UIElement child = canvas.Children[i] as UIElement;
if (canvas.Children[i] is UIElement) Canvas.SetZIndex(child, zIndex++);
}
【讨论】:
不要堆叠两个网格,而是更改可见性属性,使您不使用的网格折叠起来。
【讨论】: