【问题标题】:Difference between the AdornerLayer.Update methodsAdornerLayer.Update 方法之间的区别
【发布时间】:2020-08-14 13:09:18
【问题描述】:

AdornerLayer.Update()AdornerLayer.Update(UIElement) 之间究竟有什么区别?

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

UIElement1  
-> UIElement2  
-> UIElement3

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

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

【问题讨论】:

  • 你想达到什么目的?如果您要自定义adorner,则只需覆盖OnRender
  • @Sinatr 我正在尝试了解更新方法的不同之处,以提高我的装饰器的性能。

标签: c# wpf adorner


【解决方案1】:

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

Adorners Overview - Adorning a Single UIElement

GetAdornerLayer 从指定的 UIElement 开始向上遍历可视化树,并返回它找到的第一个装饰层。 (如果没有找到装饰层,该方法返回null。)

AdornerDecorator

AdornerDecorator 指定 AdornerLayer 在 视觉树。它通常在 ControlTemplate 中用于控件 可能承载 Adorner 对象。例如,一个 ControlTemplate Window 包含一个 AdornerDecorator 以便 窗户可以装饰。 GetAdornerLayer 方法返回 null 如果你 传入一个没有 AdornerDecorator 的元素作为 视觉树中的祖先。

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

【讨论】:

  • 很有趣,所以我可以在必要时通过创建自定义 ControlTemplate 添加自己的 AdornerLayer。是否有哪些控件已经提供了 AdornerLayer 的列表,还是我需要检查每个 ControlTemplate?
  • @gartenriese 我不知道任何列表。但你不应该真的需要知道。据我所知,无论AdornerLayers 有多少,Adorners 的工作原理都是一样的——只要至少有一个。
  • 我有很多装饰器,所以我担心性能。我正在寻找在不更新所有其他装饰器的情况下更新一些装饰器的方法。
  • @gartenriese 您可以尝试在个人Adorners 上致电InvalidateVisual
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-15
  • 2014-11-07
  • 2011-02-02
  • 1970-01-01
相关资源
最近更新 更多