2009-01-17 36 views
7

Ho semplicemente due griglia l'una sull'altra. Dato uno stato del mondo, voglio che la griglia A sia in cima, dato un altro stato del mondo, voglio che la griglia B sia in cima. In passato potevamo chiamare grid.BringToFront(), ma questo non esiste più e non riesco a trovare un modo per farlo.Come posso portare un oggetto in primo piano in wpf?

Il meglio che riesco a capire, ho bisogno di creare le mie classi personalizzate per consentire questa funzionalità, ma che sembra un grande overkill per qualcosa che era molto semplice.

risposta

11

È possibile utilizzare la proprietà Panel.ZIndex per modificare l'ordine di visualizzazione degli elementi in un pannello

+0

la domanda non riguardava il cambio dell'ordine, ma portare in primo piano, che sicuramente consiste nel fondare il maxOrder esistente e nell'impostare un ordine più grande ... – serhio

3

Devi usare la proprietà di indice Z, e perché non ci sono costruito -in funzione di fare quello che vuoi, ho fatto il mio. Più alto è il valore Z, più vicino è il "più vicino" al controllo. Quindi vuoi mettere il tuo controllo in cima senza dover impostare un valore Z arbitrario alto.

Quindi ecco una piccola funzione che ho scritto per fare esattamente questo. Nota: questo presuppone che si stia utilizzando una Canvas e UserControls. Quindi potrebbe essere necessario adattarlo un po 'se non è il tuo caso.

Fondamentalmente otterrà l'indice del controllo da spostare, quindi qualsiasi controllo attualmente sopra verrà abbassato di 1 e il controllo da spostare verrà messo in primo piano (per mantenere la gerarchia).

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 ... non tutti usano la tela – user1034912

-1

A chi può interessare:

ZIndex proprietà è 0 per impostazione predefinita, quindi se avete (come me) una tela con più di 1 elemento (> 4000 Forme nel mio caso), tutto avrà ZIndex = 0, quindi cambiare ZIndex con questo metodo non avrà alcun effetto.

Per fare in modo che funzioni, ho impostato ZIndex su un valore noto dopo aver creato tutti gli elementi, in modo che possano essere ordinati dopo.

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

Invece di impilare le due griglie, modificare le proprietà di visibilità così la griglia non si sta utilizzando è crollato.

Problemi correlati