Search code examples
wpfadornervisual-treeadornerlayeradornerdecorator

Why AdornerLayers are always the top most layers? Is there a way to change it?


  1. Why is that the adorner layer is always rendered as the top most layer in an application (under AdornerDecorator - refer screenshot)?
  2. Is there a way to change the layer/level on to which the adorners can be drawn?

In the following screenshot, AdornerLayer is added to AdornerDecorator and the Adorners (MyAdorners) are added to this AdornerLayer. But the AdornerLayer is retrieved like this,

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

AdornerLayer - Outline


Solution

  • To answer my second question,

    Is there a way to change the layer/level on to which the adorners can be drawn?

    I guess I have found a solution. Just place an AdornerDecorator element around the level on to which the adorners needs to be rendered. Any control requiring an adorner layer would use this AdornerDecorator element to place its decorators.

    Here I have moved the adorners to a different level using the following code snippet.

    <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

    Kindly correct me if I am wrong.