GetAdornerLayer对于WPF用户控件始终返回null

Vis*_*V A 0 c# wpf user-controls

我总是为空

_AdornerLayer = AdornerLayer.GetAdornerLayer(InteractiveCanvas);
Run Code Online (Sandbox Code Playgroud)

可能是什么原因。我想获取AdornerLayer并需要添加_AdornerCursor相同的

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

hai*_*ndl 5

根据文档,AdornerLayer的上方的VisualTree中没有任何内容InteractiveCanvas。这可能有很多原因。

例如,可能您InteractiveCanvas还不在VisualTree中。(至少在a Window或a之类的可见对象中没有Popup。)如果您具有以下内容,则可能是这种情况:

var adornerLayer = AdornerLayer.GetAdornerLayer(new Button());
// adornerLayer will be null every time.
Run Code Online (Sandbox Code Playgroud)

背后的逻辑AdornerLayer.GetAdornerLayer(visual)非常简单。它只是通过使用VisualTree VisualTreeHelper.GetParent(visual)。如果该父对象是an AdornerDecorator或a,ScrollContentPresenter则它将返回.AdornerLayer该父对象的属性(保证或多或少不为null)。如果它到达VisualTree的根目录并且没有找到这两种类型的视觉效果中的任何一种,则返回null与您的情况相同的形式。

因此,请在Visual Studio,MoleSnoop中InteractiveCanvas使用WPF Tree Visualizer检查您的VisualTree,并查找任何或父元素。如果找不到任何一个,那么这就是问题背后的原因。AdornerDecoratorScrollContentPresenter

如果您还不能放入InteractiveCanvasVisualTree中,也可以<AdornerDecorator>在XAML中的上方手动放置一个元素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.
Run Code Online (Sandbox Code Playgroud)

底线:在您的VisualTree中检查父母InteractiveCanvas,您将找到答案。