23

我只是在彼此之上有两个网格。给定世界的一种状态,我希望网格 A 位于顶部,给定另一种世界状态,我希望网格 B 位于顶部。在过去,我们可以只调用 grid.BringToFront(),但这已经不存在了,我想不出任何方法来实现它。

我能想到的最好的情况是,我需要创建自己的自定义类来实现此功能,但这对于曾经如此简单的东西来说似乎是一种过大的杀伤力。

4

4 回答 4

22

您可以使用Panel.ZIndex属性更改面板中元素的显示顺序

于 2009-01-17T17:23:47.273 回答
8

你必须使用 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)
            {
            }
    }
于 2014-06-09T13:07:22.797 回答
4

敬启者:

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++);
    }
于 2016-05-31T05:43:23.823 回答
2

不要堆叠两个网格,而是更改可见性属性,以便折叠您不使用的网格。

于 2017-03-01T20:41:08.317 回答