如何在 WPF 中为装饰器设置 Z 顺序索引

Posted

技术标签:

【中文标题】如何在 WPF 中为装饰器设置 Z 顺序索引【英文标题】:How to set the Z order index for adorner in WPF 【发布时间】:2014-04-24 09:36:43 【问题描述】:

我正在尝试为装饰器设置 Z 顺序索引,目前装饰器位于最顶层,我想将其更改为它正在装饰的控件的索引。

当我为需要装饰器的控件调用 Panel.GetZIndex(control) 时,它返回 0,这是我没想到的。

当我尝试使用 0 或 int.MinValue 设置装饰器 Z 索引时,它似乎没有任何影响,并且装饰器仍处于最顶层。

装饰器的Z序索引如何设置?

【问题讨论】:

【参考方案1】:

我认为也许您可以阅读 MSDN 上的 Adorners Overview 页面。无法更改 Adorner 的 Z-Index 的原因是因为它不是普通视觉树的一部分,实际上,它位于自己的 AdornerLayer 中,始终位于主视觉树的顶部。从链接页面:

装饰器在 AdornerLayer 中渲染,这是一个始终位于被装饰元素或被装饰元素集合之上的渲染表面。

请注意,调用Panel.GetZIndex(control) 不会对Adorner 执行任何操作,因为它不在Panel 中。这与尝试在不在Grid 中的UIElement 上设置Grid.Row 附加属性相同......它不会产生任何效果。

【讨论】:

我知道 XAML 中的 adorners 架构师,其他几个 SO 问题讨论了为 adorners 操作 Z 顺序 我知道装饰器的建筑师...然后你就会知道你不能为他们设置Z-Index 这暗示了能够改变 Z 顺序 - ***.com/questions/13209695/… 老兄...如果您问错了问题,我很抱歉,但您问了这个问题,我按“原样”回答。如果您想实现特定的东西,那么您应该提供该信息。我建议您要么尝试链接问题中的建议,要么提出一个新问题,明确说明您实际上试图实现的目标......我猜它可以实现无需更改AdornerZ-Index(这是不可能可能的)。 没问题,只是试图解决 UI 边缘情况,可能只是一起删除装饰器 :)

以上是关于如何在 WPF 中为装饰器设置 Z 顺序索引的主要内容,如果未能解决你的问题,请参考以下文章

没有事件传递给 WPF 装饰层

如何在 unittest 中的 setUpClass 上设置条件装饰器?

如何在其他一切之上绘制 WPF 装饰器?

保存 WPF 装饰器

WPF - 拖放 - 装饰器在控件外消失

如何在 Python 中模拟装饰器的内部调用