Почему AdornerLayers всегда самые верхние слои? Есть ли способ изменить это?

  1. Почему слой надстройки всегда отображается как самый верхний слой в приложении (в разделе AdornerDecorator - см. Снимок экрана)?
  2. Есть ли способ изменить слой / уровень, на котором можно рисовать украшения?

На следующем снимке экрана AdornerLayer добавлен в AdornerDecorator, а Adorners (MyAdorners) добавлены в этот AdornerLayer. Но AdornerLayer получается так,

        AdornerLayer layer1 = AdornerLayer.GetAdornerLayer(button1);
        layer1.Add(new MyAdorner(button1));

AdornerLayer - Схема

2 ответа

Чтобы ответить на мой второй вопрос,

Есть ли способ изменить слой / уровень, на котором можно рисовать украшения?

Я думаю, что нашел решение. Просто поместите элемент AdornerDecorator вокруг уровня, на котором необходимо визуализировать элементы оформления. Любой элемент управления, требующий слоя adorner, будет использовать этот элемент AdornerDecorator для размещения своих декораторов.

Здесь я переместил украшения на другой уровень, используя следующий фрагмент кода.

<Window x:Class="CustomAdornerLayer.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
<Grid>
    <StackPanel Background="Yellow" Width="Auto">
        <Button>Button3</Button>
    </StackPanel>
    <AdornerDecorator>
        <Grid>
            <AdornerDecorator>
                <Button x:Name="button1" Margin="70,73,265,158">Button1</Button>
            </AdornerDecorator>
            <AdornerDecorator>
                <Button x:Name="button2" Margin="87,51,248,180">Button2</Button>
            </AdornerDecorator>
        </Grid>
    </AdornerDecorator>
</Grid>

Хотя AdornerLayer по-прежнему запрашивается таким же образом,

        AdornerLayer layer1 = AdornerLayer.GetAdornerLayer(button1);
        layer1.Add(new MyAdorner(button1));
        AdornerLayer layer2 = AdornerLayer.GetAdornerLayer(button2);
        layer2.Add(new MyAdorner(button2));

Слой Adorner - Индивидуальные

Пожалуйста, поправьте меня, если я ошибаюсь.

Слой Adorner предоставляется AdornerDecorator. Когда вы запрашиваете слой для данного элемента управления, wpf ищет верхнее визуальное дерево AdornerDecorator. Зачем вам нужно менять эту логику? Система Adorners специально создана для того, чтобы украшения находились над украшенным элементом.

Вы можете искать AdornerDecorator самостоятельно с VisualTreeHelper

Другие вопросы по тегам