【问题标题】:How do I bring an item to the front in wpf?如何在 wpf 中将项目置于最前面?
【发布时间】:2010-10-02 00:03:54
【问题描述】:

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

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

【问题讨论】:

    标签: wpf grid z-index z-order


    【解决方案1】:

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

    【讨论】:

    • 问题不是关于改变顺序,而是提出来,这肯定在于建立现有的 maxOrder,并设置一个比这个更大的顺序......
    【解决方案2】:

    你必须使用 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)
                {
                }
        }
    

    【讨论】:

      【解决方案3】:

      可能涉及的人员:

      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++);
          }
      

      【讨论】:

      • 一个更好的方法似乎是抛出 if (zIndex > currentIndex) { Canvas.SetZIndex(child, zIndex - 1); } 并将最后一行替换为 Canvas.SetZIndex(pToMove, maxZ + 1);
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2010-09-20
        • 2017-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-14
        • 2015-06-28
        • 1970-01-01
        相关资源
        最近更新 更多