2009-01-17 8 views
7

У меня просто две сетки друг на друга. Учитывая одно состояние мира, я хочу, чтобы сетка A была сверху, учитывая другое состояние мира, я хочу, чтобы сетка B была сверху. В прежние времена мы могли просто вызвать grid.BringToFront(), но этого больше не существует, и я не могу понять, каким образом это произойдет.Как перенести элемент на передний план в wpf?

Лучшее, что я могу представить, мне нужно создать свои собственные пользовательские классы, чтобы позволить эту функциональность, но это похоже на серьезный перебор для чего-то, что было так просто.

ответ

11

Вы можете использовать Panel.ZIndex свойство, чтобы изменить порядок отображения элементов в панели

+0

вопрос был не в изменении порядка, а в том, чтобы вывести на передний план, что, безусловно, состоит в создании существующего maxOrder и установке большего, чем этот порядок ... – serhio

3

Вы должны использовать свойство индекса 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) 
      { 
      } 
    } 
+0

zzzzz ... no все используют холст – user1034912

-1

Для кого это может касаться:

ZIndex свойство 0 по умолчанию, так что если у вас есть (как я) на холсте с более чем 1 элемент (> 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++); 
    } 
1

Вместо того, чтобы складывать две сетки, измените свойства видимости, чтобы сетка, которую вы не используете, рухнула.

Смежные вопросы