试图澄清观察结果。 (我似乎无法从谷歌那里找到答案)。我正在使用装饰器进行一些图像编辑。我的图片都在ItemsControl
和InkCanvas
的子项中。
对GetAdornerLayer()
中的元素使用ItemsControl
时,我会自动在ItemsTemplate
内的元素上获取一个Adorner图层。但是,如果我使用VisualTreeHelper
进一步向上查看可视树,我会在AdornerLayer
的所有项目上方找到另一个ItemsControl
。 (ItemsControl
本身就是Grid
的孩子。另一方面,当访问AdornerLayer
的孩子的InkCanvas
时,我会得到一个位于InkCanvas
本身及其子女之间的装饰图层。
因此,在这两种情况下,似乎很明显WPF始终在内容控件及其子代之间放置一个adornerlayer。
确实如此吗?
TIA。
答案 0 :(得分:1)
这取决于如何定义控件的ControlTemplates
。 AdornerLayer.GetAdornerLayer
方法从指定的Visual
开始遍历可视树,并返回它找到的第一个AdornerDecorator
或ScrollContentPresenter
元素的装饰层。
因此,WPF并不会自动"始终在内容控件及其子代之间放置一个adornerlayer"。相反,控件作者通过向可视化树添加AdornerDecorator来提供装饰器层。
例如,如果您查看ControlTemplate
的默认Window
,您会发现它确实包含<AdornerDecorator>
元素。