Как вывести предмет на передний план в wpf? - PullRequest
10 голосов
/ 17 января 2009

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

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

Ответы [ 5 ]

16 голосов
/ 17 января 2009

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

4 голосов
/ 09 июня 2014

Вы должны использовать свойство индекса 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)
            {
            }
    }
2 голосов
/ 01 марта 2017

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

1 голос
/ 31 мая 2016

К кому это может относиться:

ZIndex свойство по умолчанию равно 0, поэтому если у вас (как и у меня) Canvas с более чем 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++);
    }
0 голосов
/ 29 июля 2010

Подробный пример для этого Здесь

...