GetAdornerLayer神秘地返回null

时间:2010-06-14 16:41:36

标签: c# wpf nullreferenceexception adorner adornerlayer

我一直在为我的应用程序的多个版本使用相同的代码而没有任何问题,但我现在神秘地接收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)将上述元素的实例(UserControl)放在ItemsControl中。

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

3 个答案:

答案 0 :(得分:11)

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

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

<Style TargetType="my:MyWindow" BasedOn="{StaticResource {x:Type Window}}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="my:MyWindow">
                <AdornerDecorator>
                <DockPanel ...>
                </DockPanel>
                </AdornerDecorator>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

答案 1 :(得分:8)

AdornerLayer.GetAdornerLayer的文档指定:

  

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

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

答案 2 :(得分:3)

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

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