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和您正在使用的代码的详细信息?谢谢您的回答