C# GetAdornerLayer始终为WPF usercontrol返回null

C# GetAdornerLayer始终为WPF usercontrol返回null,c#,wpf,user-controls,C#,Wpf,User Controls,我总是为你感到失望 _AdornerLayer = AdornerLayer.GetAdornerLayer(InteractiveCanvas); 原因可能是什么。我想获得AdornerLayer,需要在同一层上添加\u AdornerCursor 我已经看到了一些可能的答案,但它对我不起作用,根据您的交互视图上方的VisualTree中没有任何装饰层。这可能有很多原因 例如,您的InteractiveCanvas可能还不在VisualTree中。(至少在像窗口或弹出窗口这样的可见窗口中是不

我总是为你感到失望

_AdornerLayer = AdornerLayer.GetAdornerLayer(InteractiveCanvas);
原因可能是什么。我想获得
AdornerLayer
,需要在同一层上添加
\u AdornerCursor

我已经看到了一些可能的答案,但它对我不起作用,根据您的
交互视图上方的VisualTree中没有任何
装饰层
。这可能有很多原因

例如,您的
InteractiveCanvas
可能还不在VisualTree中。(至少在像
窗口
弹出窗口
这样的可见窗口中是不存在的)如果您有这样的东西,就会出现这种情况:

var adornerLayer = AdornerLayer.GetAdornerLayer(new Button());
// adornerLayer will be null every time.
var btn = new Button();
var ad = new AdornerDecorator();
ad.Child = btn;
var adornerLayer = AdornerLayer.GetAdornerLayer(btn);
// adornerLayer will now be NOT null every time.
AdornerLayer.GetAdornerLayer(可视)
背后的逻辑非常简单。它只是使用
visualtreeheloper.GetParent(visual)
在VisualTree上走。如果该父级是
AdornerDecorator
ScrollContentPresenter
,则它返回该父级的属性
.AdornerLayer
(或多或少保证该属性不为空)。如果它到达VisualTree的根目录,并且没有找到这两种类型的任何一种视觉效果,它将返回与您的情况相同的
null

因此,请使用Visual Studio中的或检查您的
InteractiveCanvas的VisualTree,并查看父元素中的任何
AdornerDecorator
ScrollContentPresenter
。如果你找不到他们中的任何一个,那么这正是你问题背后的原因

如果您还不能将
InteractiveCanvas
放入VisualTree中,也可以手动将
元素放置在
InteractiveCanvas
上方的XAML中。此元素将创建一个单独的
装饰层
,您的代码将找到它。当然,这可以在C#中完成,也可以这样做:

var adornerLayer = AdornerLayer.GetAdornerLayer(new Button());
// adornerLayer will be null every time.
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中检查父母,你会找到答案。

@mybirthname怎么可能?请阅读问题,您能否提供更多有关xaml和您正在使用的代码的详细信息?谢谢您的回答