2009-01-17 18 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

而不是堆疊兩個網格,更改可見性屬性,以便您不使用的網格已摺疊。

相關問題