首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于WPF用户控件,GetAdornerLayer总是返回null

对于WPF用户控件,GetAdornerLayer总是返回null
EN

Stack Overflow用户
提问于 2016-10-21 11:11:07
回答 1查看 1.7K关注 0票数 0

我总是空着

代码语言:javascript
复制
_AdornerLayer = AdornerLayer.GetAdornerLayer(InteractiveCanvas);

可能是什么原因。我想获得AdornerLayer,并且需要在相同的基础上添加一个_AdornerCursor

我看到了一些可能的答案,但这对我没有用

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-21 13:24:17

根据文档,在VisualTree中,在InteractiveCanvas之上没有任何AdornerLayer。这可能有很多原因。

例如,您的InteractiveCanvas可能还没有在VisualTree中。(至少在可见的WindowPopup这样的可见系统中是不存在的。)如果你有这样的东西,情况就会是这样:

代码语言:javascript
复制
var adornerLayer = AdornerLayer.GetAdornerLayer(new Button());
// adornerLayer will be null every time.

AdornerLayer.GetAdornerLayer(visual)背后的逻辑非常简单。它只是使用VisualTree在VisualTreeHelper.GetParent(visual)上行走。如果该父服务器是AdornerDecoratorScrollContentPresenter,那么它将返回该父服务器的属性.AdornerLayer (该属性或多或少保证不为null)。如果它到达了VisualTree的根目录,并且没有找到这两种类型的可视化,它就会返回null,就像在您的例子中一样。

因此,使用VisualTree、VisualTree或斯诺普中的WPF树可视化器检查InteractiveCanvasWPF树可视化器,并查看父元素中的任何AdornerDecoratorScrollContentPresenter。如果你找不到他们中的任何一个,那么这正是你问题背后的原因。

如果您还不能将您的InteractiveCanvas放在VisualTree中,则还可以在XAML中将<AdornerDecorator>元素手动放置在InteractiveCanvas之上。这个元素将创建一个独立的AdornerLayer,您的代码将找到它。当然,在C#中也可以这样做:

代码语言:javascript
复制
var btn = new Button();
var ad = new AdornerDecorator();
ad.Child = btn;
var adornerLayer = AdornerLayer.GetAdornerLayer(btn);
// adornerLayer will now be NOT null every time.

底线:检查你的VisualTree中的父母InteractiveCanvas,你会找到答案。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40175133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档