0

只是想澄清一个观察。(我似乎无法从谷歌找到直接的答案)。我正在使用装饰器进行一些图像编辑。我的图像既在 an 中ItemsControl,也作为InkCanvas.

GetAdornerLayer()用于 中的元素时ItemsControl,我会自动在ItemsTemplate. 但是,如果我用 进一步向上查看视觉树VisualTreeHelper,我会发现另一个AdornerLayer高于所有项目的ItemsControl. ( theItemsControl本身就是 a 的孩子Grid)。另一方面,当访问 的AdornerLayer子级时,我得到一个位于自身及其子InkCanvas级之间的装饰层。InkCanvas

因此,在这两种情况下,WPF 似乎总是在内容控件及其子控件之间放置一个装饰层。

真的是这样吗?

TIA。

4

1 回答 1

1

这取决于ControlTemplates控件的定义方式。该AdornerLayer.GetAdornerLayer方法从指定位置开始向上遍历可视化树,并返回它找到的第一个或元素Visual的装饰层。AdornerDecoratorScrollContentPresenter

因此 WPF 不会自动“总是在内容控件及其子项之间放置一个装饰层”。而是控件作者通过将AdornerDecorator添加到可视化树来提供装饰层。

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

于 2017-11-29T12:58:37.593 回答