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 它找到的第一个 AdornerDecorator
或 ScrollContentPresenter
元素的装饰层开始向上遍历可视化树。
所以 WPF 不会自动 "always placing an adornerlayer between a contentcontrol and its children"。而是控件作者通过向可视化树添加 AdornerDecorator 来提供装饰层。
例如,如果您查看 Window
的默认 ControlTemplate
,您会发现它确实包含一个 <AdornerDecorator>
元素。
只是想澄清一个观察结果。 (我似乎无法从 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 它找到的第一个 AdornerDecorator
或 ScrollContentPresenter
元素的装饰层开始向上遍历可视化树。
所以 WPF 不会自动 "always placing an adornerlayer between a contentcontrol and its children"。而是控件作者通过向可视化树添加 AdornerDecorator 来提供装饰层。
例如,如果您查看 Window
的默认 ControlTemplate
,您会发现它确实包含一个 <AdornerDecorator>
元素。