11

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

奇怪的是,这种情况并非一直发生,而且很难预测何时会发生,因此并不可靠。

4

3 回答 3

13

就我而言,我有一个基于WindowGetAdornerLayer()返回 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>
于 2012-08-13T13:47:29.520 回答
8

AdornerLayer.GetAdornerLayer的文档指定:

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

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

于 2010-06-14T16:44:27.157 回答
4

我很好奇这是否真的解决了。AdornerDecorator 为它下面的元素提供了一个 AdornerLayer——一切都在它下面。它是一个装饰器,这意味着它有一个作为内容的 Child。该内容由 AdornerLayer 提供。因此,如果您在 XAML 中放置一个 AdornerDecorator 并且子元素是边框,那么边框确实有一个 AdornerLayer。

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

于 2010-08-04T20:27:24.007 回答