我一直在我的应用程序的几个版本中使用相同的代码,没有任何问题,但我现在神秘地收到NullRerefenceException
s,如下所示:
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)将上述元素的示例(UserControl
)放置在ItemsControl
中。
奇怪的是,这种情况并不总是发生,而且很难预测它何时会发生,所以它并不可靠。
4条答案
按热度按时间5kgi1eie1#
在我的例子中,我有一个基于
Window
的类,GetAdornerLayer()
返回null。原来我的派生类的ControlTemplate
不包含AdornerDecorator
。将其添加为ControlTemplate
中的顶层解决了这个问题。relj7zay2#
AdornerLayer.GetAdornerLayer的文档规定:
如果未找到装饰器层,则该方法返回null。
所以我猜没有装饰层...你有什么理由相信这不应该是这样的吗?您目前依靠什么来保证可视化树中会有一个装饰器层?
lmyy7pcs3#
我很好奇这件事是否真的解决了。AdornerDecorator为它下面的元素提供一个AdornerLayer--所有内容都在它下面。它是一个装饰器,这意味着它有一个作为内容的Child。该内容由AdornerLayer提供。因此,如果您在XAML中放置AdornerDecorator,并且子元素是边框,则边框确实具有AdornerLayer。
此外,Window定义了一个AdornerDecorator作为可视化树的顶部,因此Window中的任何元素都将在其上方有一个AdornerLayer。所以,如果你上面的内容是在一个窗口...
z9smfwbn4#
这个答案可能来得晚,但无论如何...
在documentation of AdornerDecorators中写入以下内容:
如果传入的元素在其可视化树中没有AdornerDecorator作为祖先,则GetAdornerLayer方法返回null。
所以也许你的
background
元素不是AdornerDecorator
的子元素?