我只是在彼此之上有两个网格。给定世界的一种状态,我希望网格 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 个形状)的 Canvas,所有都会有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++);
}
不要堆叠两个网格,而是更改可见性属性,以便折叠您不使用的网格。