GetAdornerLayer神秘地返回null

dev*_*os1 10 c# wpf adorner adornerlayer nullreferenceexception

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

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

background只是一个Border元素.

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

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

Flo*_*Lim 11

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

在我的情况下,我有一个基于的类,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>
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 8

AdornerLayer.GetAdornerLayer的文档指定:

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

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

  • 如果我使用`AdornerDecorator`而不是'Border`,也会出现同样的情况,尽管我现在根据MSDN看到它"为可视树中的*下面的元素*提供了一个装饰层".让我尝试在AdornerLayer中包装Bor​​der ... (2认同)