我只有两个网格在彼此之上。鉴于世界上的一个状态,我希望网格A位于顶部,给定另一个世界状态,我希望网格B位于顶部。在过去,我们可以调用grid.BringToFront(),但这不再存在,我无法找到任何方法来实现这一点。
我能想到的最好的,我需要创建自己的自定义类来允许这个功能,但这似乎对以前那么简单的事情有点过分。
答案 0 :(得分:16)
您可以使用Panel.ZIndex属性更改面板中元素的显示顺序
答案 1 :(得分:4)
你必须使用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)
{
}
}
答案 2 :(得分:2)
不是堆叠两个网格,而是更改可见性属性,以便折叠未使用的网格。
答案 3 :(得分:1)
可能关注的人:
默认情况下, ZIndex
属性为0,所以如果你(像我一样)有一个超过1个元素的Canvas(在我的情况下是> 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++);
}
答案 4 :(得分:0)
这方面的详细示例是Here