2009-01-17 70 views
7

我只有两个网格在另一个之上。鉴于世界上的一个国家,我希望网格A在世界的另一个状态上处于顶端,我希望网格B位于顶端。在过去,我们可以调用grid.BringToFront(),但现在已经不存在了,我无法找到任何方法来实现这一点。如何在wpf中将项目放到前面?

最好的我可以想象,我需要创建我自己的自定义类来允许此功能,但这似乎是过去那么简单的事情的主要矫枉过正。

回答

11

可以使用Panel.ZIndex属性来改变在一个面板元件的显示顺序

+0

这个问题不是关于改变顺序,而是前面说的,当然,创建现有的maxOrder,并设置一个更大的顺序... – serhio 2011-04-14 16:46:13

3

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

zzzzz ...没有人使用画布 – user1034912 2017-02-22 15:00:53

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

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