AdornerLayer.Update 方法之间的区别

Difference between the AdornerLayer.Update methods

AdornerLayer.Update() and AdornerLayer.Update(UIElement)到底有什么区别?

据我了解,每个 ui 元素只有一个装饰层,您可以使用 AdornerLayer.GetAdornerLayer(Visual) 获得它。我能看到的唯一区别是每个 ui 元素是否没有装饰层。因此,例如,如果我有以下视觉树:

UIElement1  
-> UIElement2  
-> UIElement3

然后 UIElement23 没有自己的装饰层,而是使用 UIElement1 的装饰层。然后 Update() 会更新 UIElement123 的所有装饰器,而 Update(UIElement) 只会更新相应 ui 元素的装饰器。

那么,当 UI 元素拥有自己的装饰层以及当它使用视觉树中更高层的 UI 元素的装饰层时,条件是什么?

每个 UIElement 而不是 会自动拥有自己独特的 AdornerLayer。看看这个文档:

Adorners Overview - Adorning a Single UIElement

GetAdornerLayer walks up the visual tree, starting at the specified UIElement, and returns the first adorner layer it finds. (If no adorner layers are found, the method returns null.)

AdornerDecorator

The AdornerDecorator specifies the position of the AdornerLayer in the visual tree. It is typically used in a ControlTemplate for a control that might host Adorner objects. For example, the ControlTemplate of a Window contains an AdornerDecorator so that the child elements of the window can be adorned. The GetAdornerLayer method returns null if you pass in an element that does not have an AdornerDecorator as an ancestor in its visual tree.

因此,如果您使用 Window 作为根元素,则保证在可视化树中至少有一个 Adorner,根据您使用的其他元素,可能会有更多.