父内容控件与其子控件之间是否始终存在Adorner层?

时间:2017-11-28 20:19:44

标签: wpf xaml adornerlayer

试图澄清观察结果。 (我似乎无法从谷歌那里找到答案)。我正在使用装饰器进行一些图像编辑。我的图片都在ItemsControlInkCanvas的子项中。

GetAdornerLayer()中的元素使用ItemsControl时,我会自动在ItemsTemplate内的元素上获取一个Adorner图层。但是,如果我使用VisualTreeHelper进一步向上查看可视树,我会在AdornerLayer的所有项目上方找到另一个ItemsControl。 (ItemsControl本身就是Grid的孩子。另一方面,当访问AdornerLayer的孩子的InkCanvas时,我会得到一个位于InkCanvas本身及其子女之间的装饰图层。

因此,在这两种情况下,似乎很明显WPF始终在内容控件及其子代之间放置一个adornerlayer。

确实如此吗?

TIA。

1 个答案:

答案 0 :(得分:1)

这取决于如何定义控件的ControlTemplatesAdornerLayer.GetAdornerLayer方法从指定的Visual开始遍历可视树,并返回它找到的第一个AdornerDecoratorScrollContentPresenter元素的装饰层。

因此,WPF并不会自动"始终在内容控件及其子代之间放置一个adornerlayer"。相反,控件作者通过向可视化树添加AdornerDecorator来提供装饰器层。

例如,如果您查看ControlTemplate的默认Window,您会发现它确实包含<AdornerDecorator>元素。