我只有两个网格在另一个之上。鉴于世界上的一个国家,我希望网格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