为什么装饰层总是在最顶部?有没有改变它的方法?

4
  1. 为什么装饰层总是在应用程序中呈现为最顶层(在 AdornerDecorator 下方 - 参见截图)?
  2. 有没有一种方法可以更改可以绘制装饰层/级别的层/级别?

在下面的屏幕截图中,AdornerLayer 被添加到 AdornerDecorator 中,并且 Adorners(MyAdorners)被添加到此 AdornerLayer 中。但是,AdornerLayer 是这样检索的,

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

AdornerLayer - Outline

2个回答

7
回答我的第二个问题:是否有一种方法可以更改装饰器可以绘制到的图层/级别?
我想我已经找到了解决方案。只需在需要呈现装饰器的级别周围放置一个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>

虽然 AdornerLayer 的查询方式仍然相同,
        AdornerLayer layer1 = AdornerLayer.GetAdornerLayer(button1);
        layer1.Add(new MyAdorner(button1));
        AdornerLayer layer2 = AdornerLayer.GetAdornerLayer(button2);
        layer2.Add(new MyAdorner(button2));

装饰层 - 自定义

如果我理解有误,请指出。


为什么需要将AdornerDecorator设置为装饰控件的直接父级? - Pavel Voronin
这是我的要求。我想用myadorner1装饰我的button1,当button2放在button1的上面时,myadorner1应该被裁剪,button2应该完全可见,并带有它自己的adorner,即myadorner2。现在清楚了吗? - sudarsanyes
说实话还没有。如果它们共享相同的装饰层,这种情况不会发生吗?据我记得,您可以设置 Adorner 的 Panel.ZIndex 附加属性。 - Pavel Voronin
你的解决方案出现在我苦思冥想了两个小时如何实现对装饰层上显示内容进行剪裁之后。非常感谢你,这真是救命稻草... - Gregor Leban
太棒了!!非常感谢。 - Kath

3

Adorner layer(装饰层)由AdornerDecorator提供。当您请求给定控件的层时,wpf会查找AdornerDecorator上方的可视树。

为什么需要更改这个逻辑? Adorners系统有意通过这种方式实现了装饰出现在被装饰元素之上的功能。

您可以使用VisualTreeHelper自行搜索AdornerDecorator。


谢谢您的回复。现在我明白了 GetAdornerLayer 的工作原理。 - sudarsanyes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接