2009-01-17 32 views
7

Simplemente tengo dos cuadrículas 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 ninguna forma de que eso ocurra.¿Cómo traigo un artículo al frente en wpf?

Lo mejor que puedo imaginar es que necesito crear mis propias clases personalizadas para permitir esta funcionalidad, pero eso parece ser una gran exageración para algo que solía ser tan simple.

Respuesta

11

Usted puede utilizar la propiedad Panel.ZIndex para cambiar el orden de presentación de los elementos en un panel

+0

la pregunta no era sobre cambiar el orden, sino traer al frente, eso seguramente, consiste en fundar el maxOrder existente, y establecer un orden más grande que este ... – serhio

3

Tienes que utilizar la propiedad índice Z, y porque no hay edificados -en función de hacer lo que quieras, hice mi propio. 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. Así que es posible que tenga que adaptarlo un poco si ese no es su caso.

Básicamente obtendrá el índice del control para moverse, luego cualquier control que esté actualmente encima bajará 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) 
      { 
      } 
    } 
+0

zzzzz ... no todo el mundo usa lienzos – user1034912

-1

Para quien pueda interesar:

ZIndex propiedad es 0 por defecto, por lo que si usted tiene (como yo) un lienzo con más de 1 elemento (> 4000 Formas en mi caso), todos tendrán ZIndex = 0, por lo que cambiar los ZIndex con este método no tendrá ningún efecto.

Para que esto funcione, ajusto los ZIndex a un valor conocido después de crear todos los elementos, por lo que se pueden pedir 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++); 
    } 
1

En lugar de apilar las dos cuadrículas, cambie las propiedades de visibilidad para que la cuadrícula que no está utilizando se contraiga.

Cuestiones relacionadas