studio - ¿Cómo traigo un artículo al frente en wpf?
visual studio wpf (5)
Simplemente tengo dos grillas una encima de la otra. Dado un estado del mundo, quiero que la cuadrícula A esté en la parte superior, dado otro estado del mundo, quiero que la cuadrícula B esté en la parte superior. En los viejos tiempos, simplemente podíamos llamar a grid.BringToFront (), pero eso ya no existe, y no puedo encontrar la manera de hacerlo realidad.
Lo mejor que puedo imaginar es que necesito crear mis propias clases personalizadas para permitir esta funcionalidad, pero eso parece una gran exageración para algo que solía ser tan simple.
Tienes que usar la propiedad del índice Z, y como no hay una función incorporada para hacer lo que quieres, hice la mía. Cuanto mayor sea el valor de Z, más "cercano" estará el control. Así que desea poner su control en la parte superior sin tener que establecer un alto valor de Z arbitrario.
Así que aquí hay una pequeña función que escribí para mí para hacer exactamente eso. Nota: esto supone que está utilizando un Canvas y UserControls. Por lo tanto, es posible que deba adaptarlo un poco si ese no es su caso.
Básicamente hará que el índice del control se mueva, luego cualquier control actualmente arriba de él disminuirá en 1 y el control para mover se colocará en la parte superior (para mantener la jerarquía).
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)
{
}
}
Puede usar la propiedad Panel.ZIndex para cambiar el orden de visualización de los elementos en un panel
Un ejemplo detallado de esto está aquí
A quien le interese:
ZIndex
propiedad ZIndex
es 0 por defecto, así que si tienes (como yo) un lienzo con más de 1 elemento (> 4000 Shapes en mi caso), todos tendrán ZIndex = 0
, por lo que cambiar los ZIndexes con este método no tendrá efecto.
Para que esto funcione, ajusto los ZIndex a un valor conocido después de crear todos los elementos, para que puedan ordenarse después.
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++);
}
En lugar de apilar las dos cuadrículas, cambie las propiedades de visibilidad para que la cuadrícula que no está utilizando se contraiga.