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

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

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

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

AdornerLayer — Контур


person sudarsanyes    schedule 03.11.2012    source источник


Ответы (2)


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

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

Кажется, я нашел решение. Просто поместите элемент AdornerDecorator вокруг уровня, на котором необходимо отобразить декоративные элементы. Любой элемент управления, требующий слоя декоратора, будет использовать этот элемент 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>

While the AdornerLayer is still queried in the same way,

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

Adorner Layer - Customized

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

person sudarsanyes    schedule 03.11.2012
comment
Почему вам нужно, чтобы AdornerDecorator был непосредственным родителем украшенного элемента управления? - person Pavel Voronin; 03.11.2012
comment
Это мое требование. Я хочу украсить свою кнопку1 с помощью myadorner1, и когда кнопка2 помещается поверх кнопки1, myadorner1 должен обрезаться, а кнопка2 должна быть полностью видна со своим собственным украшением, myadorner2. Надеюсь теперь понятно? - person sudarsanyes; 03.11.2012
comment
Пока нет, если честно. Разве этого не происходит, если они используют один и тот же слой украшения? Насколько я помню, вы можете установить присоединенное свойство Adorner Panel.ZIndex - person Pavel Voronin; 03.11.2012
comment
ваше решение пришло после того, как я 2 часа ломал голову, как реализовать отсечение контента, который я показываю на слое украшения. Большое спасибо. Это спасение... - person Gregor Leban; 01.03.2013
comment
Удивительный!! Большое спасибо - person Kath; 27.11.2014

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

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

person Pavel Voronin    schedule 03.11.2012
comment
спасибо за ответ. теперь я понимаю, как работает GetAdornerLayer. - person sudarsanyes; 03.11.2012