4
  1. 为什么装饰层总是呈现为应用程序中的最顶层(在 AdornerDecorator 下 - 参考屏幕截图)?
  2. 有没有办法改变可以绘制装饰器的图层/级别?

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

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

AdornerLayer - 大纲

4

2 回答 2

6

回答我的第二个问题,

有没有办法改变可以绘制装饰器的图层/级别?

我想我找到了解决办法。只需在需要渲染装饰器的级别周围放置一个 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));

装饰层 - 定制

如果我错了,请纠正我。

于 2012-11-03T16:36:11.037 回答
3

Adorner 层由 AdornerDecorator 提供。当您请求给定控件的层时,wpf 会查找 AdornerDecorator 上部可视化树。为什么你需要改变这个逻辑?Adorners 系统故意以这种方式使装饰物出现在装饰元素之上。

您可以使用 VisualTreeHelper 自己搜索 AdornerDecorator

于 2012-11-03T13:44:57.250 回答