我只有兩個網格在另一個之上。鑑於世界上的一個國家,我希望網格A在世界的另一個狀態上處於頂端,我希望網格B位於頂端。在過去,我們可以調用grid.BringToFront(),但現在已經不存在了,我無法找到任何方法來實現這一點。如何在wpf中將項目放到前面?
最好的我可以想象,我需要創建我自己的自定義類來允許此功能,但這似乎是過去那麼簡單的事情的主要矯枉過正。
我只有兩個網格在另一個之上。鑑於世界上的一個國家,我希望網格A在世界的另一個狀態上處於頂端,我希望網格B位於頂端。在過去,我們可以調用grid.BringToFront(),但現在已經不存在了,我無法找到任何方法來實現這一點。如何在wpf中將項目放到前面?
最好的我可以想象,我需要創建我自己的自定義類來允許此功能,但這似乎是過去那麼簡單的事情的主要矯枉過正。
可以使用Panel.ZIndex屬性來改變在一個面板元件的顯示順序
這方面的一個詳細的例子是Here
你必須使用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)
{
}
}
zzzzz ...沒有人使用畫布 – user1034912 2017-02-22 15:00:53
要敬啓者:
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++);
}
而不是堆疊兩個網格,更改可見性屬性,以便您不使用的網格已摺疊。
這個問題不是關於改變順序,而是前面說的,當然,創建現有的maxOrder,並設置一個更大的順序... – serhio 2011-04-14 16:46:13