GetAdornerLayer始终为WPF usercontrol返回null

时间:2016-10-21 11:11:08

标签: c# wpf user-controls

我总是空着
_AdornerLayer = AdornerLayer.GetAdornerLayer(InteractiveCanvas);

可能是什么原因。我想获得AdornerLayer并需要在同一个

上添加_AdornerCursor

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

1 个答案:

答案 0 :(得分:4)

根据documentation您在AdornerLayer上方的VisualTree中没有InteractiveCanvas。这可能有很多原因。

例如,可能是您的InteractiveCanvas还没有在VisualTree中。 (至少不是像WindowPopup那样可见的。)如果你有这样的话就会出现这种情况:

var adornerLayer = AdornerLayer.GetAdornerLayer(new Button());
// adornerLayer will be null every time.

AdornerLayer.GetAdornerLayer(visual)背后的逻辑非常简单。它只是使用VisualTreeHelper.GetParent(visual)走向VisualTree。如果该父级是AdornerDecoratorScrollContentPresenter,则它返回该父级的属性.AdornerLayer(或多或少保证不为空)。如果它到达VisualTree的根目录并且找不到这两种类型的视觉效果中的任何一种,它会像您的情况一样返回null

请使用Visual Studio中的WPF Tree VisualizerMoleSnoop检查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中的父母,您将找到答案。