parent 内容控件和它的 children 之间总是有一个装饰层吗?

Is there always an Adorner Layer between a parent content control and its children?

只是想澄清一个观察结果。 (我似乎无法从 Google 中找到直接的答案)。我正在使用装饰器进行一些图像编辑。我的图像都在 ItemsControl 和 children 的 InkCanvas.

当对 ItemsControl 中的元素使用 GetAdornerLayer() 时,我会自动在 ItemsTemplate 中的元素上获得装饰层。但是,如果我使用 VisualTreeHelper 在可视化树中更进一步,我会在 ItemsControl 的所有项目之上找到另一个 AdornerLayer。 (ItemsControl 本身就是 Grid 的 child。另一方面,当为 InkCanvas 的 child 访问 AdornerLayer 时,我得到一个位于 InkCanvas 本身及其 child 之间的装饰层任.

因此,在这两种情况下,很明显 WPF 总是在内容控件和它的 children 之间放置一个装饰层。

真的是这样吗?

TIA。

这取决于控件的 ControlTemplates 是如何定义的。 AdornerLayer.GetAdornerLayer 方法从指定的 Visual 和 returns 它找到的第一个 AdornerDecoratorScrollContentPresenter 元素的装饰层开始向上遍历可视化树。

所以 WPF 不会自动 "always placing an adornerlayer between a contentcontrol and its children"。而是控件作者通过向可视化树添加 AdornerDecorator 来提供装饰层。

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