如何在wpf中将项目带到前面?

时间:2009-01-17 17:08:23

标签: wpf grid z-index z-order

我只有两个网格在彼此之上。鉴于世界上的一个状态,我希望网格A位于顶部,给定另一个世界状态,我希望网格B位于顶部。在过去,我们可以调用grid.BringToFront(),但这不再存在,我无法找到任何方法来实现这一点。

我能想到的最好的,我需要创建自己的自定义类来允许这个功能,但这似乎对以前那么简单的事情有点过分。

5 个答案:

答案 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