GetAdornerLayer神秘地返回null

我一直在为我的应用程序的几个版本使用相同的代码而没有任何问题,但我现在神秘地接收NullRerefenceException其中包含以下内容:

 this.Loaded += delegate { deleteBrush = new DeleteBrushAdorner( background ); AdornerLayer al = AdornerLayer.GetAdornerLayer( background ); al.Add( deleteBrush ); // null ref here?? }; 

background只是一个Border元素。

我对可能导致它的原因的两点看法是:a)切换到.NET 4.0,以及b)在ItemsControl放置上述元素的实例(这是一个UserControl )。

奇怪的是,这并不是一直发生的,很难预测何时会发生,所以它不可靠。

AdornerLayer.GetAdornerLayer的文档指定:

如果未找到装饰层,则该方法返回null。

所以我的猜测是没有装饰层……你有理由相信不应该这样吗? 您目前依赖于什么保证视觉树中会有一个装饰层?

我知道这是一个古老的问题,但我今天遇到了这个问题。

在我的例子中,我有一个基于Window的类, GetAdornerLayer()返回null。 事实certificate,派生类的ControlTemplate不包含AdornerDecorator 。 将其添加为ControlTemplate的顶级解决了该问题。

  

我很好奇这是否真的得到了解决。 AdornerDecorator为其下方的元素提供AdornerLayer – 一切都将在其下方。 它是一个装饰者,意味着它有一个孩子就是内容。 该内容由AdornerLayer提供。 因此,如果您将AdornerDecorator放入XAML并且子项是边框,则边框确实具有AdornerLayer。

此外,Window将AdornerDecorator定义为可视树的顶部,因此窗口中的任何元素都将在其上方具有AdornerLayer。 所以,如果你的上方是在一个窗口……

Interesting Posts