wpf GetAdornerLayer神秘地返回null

iibxawm4  于 2023-06-07  发布在  其他
关注(0)|答案(4)|浏览(407)

我一直在我的应用程序的几个版本中使用相同的代码,没有任何问题,但我现在神秘地收到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中。
奇怪的是,这种情况并不总是发生,而且很难预测它何时会发生,所以它并不可靠。

5kgi1eie

5kgi1eie1#

在我的例子中,我有一个基于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>
relj7zay

relj7zay2#

AdornerLayer.GetAdornerLayer的文档规定:
如果未找到装饰器层,则该方法返回null。
所以我猜没有装饰层...你有什么理由相信这不应该是这样的吗?您目前依靠什么来保证可视化树中会有一个装饰器层?

lmyy7pcs

lmyy7pcs3#

我很好奇这件事是否真的解决了。AdornerDecorator为它下面的元素提供一个AdornerLayer--所有内容都在它下面。它是一个装饰器,这意味着它有一个作为内容的Child。该内容由AdornerLayer提供。因此,如果您在XAML中放置AdornerDecorator,并且子元素是边框,则边框确实具有AdornerLayer。
此外,Window定义了一个AdornerDecorator作为可视化树的顶部,因此Window中的任何元素都将在其上方有一个AdornerLayer。所以,如果你上面的内容是在一个窗口...

z9smfwbn

z9smfwbn4#

这个答案可能来得晚,但无论如何...
documentation of AdornerDecorators中写入以下内容:
如果传入的元素在其可视化树中没有AdornerDecorator作为祖先,则GetAdornerLayer方法返回null。
所以也许你的background元素不是AdornerDecorator的子元素?

相关问题