我总是空着
_AdornerLayer = AdornerLayer.GetAdornerLayer(InteractiveCanvas);可能是什么原因。我想获得AdornerLayer,并且需要在相同的基础上添加一个_AdornerCursor
我看到了一些可能的答案,但这对我没有用
发布于 2016-10-21 13:24:17
根据文档,在VisualTree中,在InteractiveCanvas之上没有任何AdornerLayer。这可能有很多原因。
例如,您的InteractiveCanvas可能还没有在VisualTree中。(至少在可见的Window或Popup这样的可见系统中是不存在的。)如果你有这样的东西,情况就会是这样:
var adornerLayer = AdornerLayer.GetAdornerLayer(new Button());
// adornerLayer will be null every time.AdornerLayer.GetAdornerLayer(visual)背后的逻辑非常简单。它只是使用VisualTree在VisualTreeHelper.GetParent(visual)上行走。如果该父服务器是AdornerDecorator或ScrollContentPresenter,那么它将返回该父服务器的属性.AdornerLayer (该属性或多或少保证不为null)。如果它到达了VisualTree的根目录,并且没有找到这两种类型的可视化,它就会返回null,就像在您的例子中一样。
因此,使用VisualTree、VisualTree或斯诺普中的WPF树可视化器检查InteractiveCanvas的WPF树可视化器,并查看父元素中的任何AdornerDecorator或ScrollContentPresenter。如果你找不到他们中的任何一个,那么这正是你问题背后的原因。
如果您还不能将您的InteractiveCanvas放在VisualTree中,则还可以在XAML中将<AdornerDecorator>元素手动放置在InteractiveCanvas之上。这个元素将创建一个独立的AdornerLayer,您的代码将找到它。当然,在C#中也可以这样做:
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,你会找到答案。
https://stackoverflow.com/questions/40175133
复制相似问题