我总是空着
_AdornerLayer = AdornerLayer.GetAdornerLayer(InteractiveCanvas);
可能是什么原因。我想获得AdornerLayer
并需要在同一个
_AdornerCursor
我已经看到了一些可能的答案,但它对我没有用
答案 0 :(得分:4)
根据documentation您在AdornerLayer
上方的VisualTree中没有InteractiveCanvas
。这可能有很多原因。
例如,可能是您的InteractiveCanvas
还没有在VisualTree中。 (至少不是像Window
或Popup
那样可见的。)如果你有这样的话就会出现这种情况:
var adornerLayer = AdornerLayer.GetAdornerLayer(new Button());
// adornerLayer will be null every time.
AdornerLayer.GetAdornerLayer(visual)
背后的逻辑非常简单。它只是使用VisualTreeHelper.GetParent(visual)
走向VisualTree。如果该父级是AdornerDecorator
或ScrollContentPresenter
,则它返回该父级的属性.AdornerLayer
(或多或少保证不为空)。如果它到达VisualTree的根目录并且找不到这两种类型的视觉效果中的任何一种,它会像您的情况一样返回null
。
请使用Visual Studio中的WPF Tree Visualizer,Mole或Snoop检查InteractiveCanvas
的VisualTree,并留意任何AdornerDecorator
或{{1在父元素中。如果你找不到任何一个,那么这正是你问题背后的原因。
如果您尚未将ScrollContentPresenter
置于VisualTree中,则还可以在InteractiveCanvas
上方的某个位置手动将<AdornerDecorator>
元素放置在XAML中。此元素将创建一个单独的InteractiveCanvas
,您的代码将在其中找到。这当然可以在C#中完成,也可以这样做:
AdornerLayer
结论:检查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中的父母,您将找到答案。