代码之家  ›  专栏  ›  技术社区  ›  devios1

GetAdornerLayer神秘返回null

  •  10
  • devios1  · 技术社区  · 15 年前

    NullRerefenceException

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

    background 只是一个 Border 元素。

    UserControl )在一个 ItemsControl .

    3 回复  |  直到 15 年前
        1
  •  8
  •   Jon Skeet    15 年前

    AdornerLayer.GetAdornerLayer 指定:

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

        2
  •  12
  •   StayOnTarget Charlie Flowers    5 年前

    在我的例子中,我有一个基于 Window GetAdornerLayer() 返回null。结果发现 ControlTemplate AdornerDecorator . 把它作为 控件模板

    <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>
    
        3
  •  4
  •   Tony Brummel    15 年前

    我很好奇这个问题是否真的解决了。一个AdorneDecorator为它下面的元素提供了一个AdornerLayer——所有的东西都在它下面。它是一个装饰,意思是它有一个孩子,这是内容。该内容正在提供一个装饰层。因此,如果在XAML中放置了一个AdornedDecorator,并且子对象是border,那么border确实有一个AdornerLayer。

    此外,Window将一个AdornedDecorator定义为可视化树的顶部,因此窗口中的任何元素都将在其上方有一个AdornerLayer。所以,如果你上面的东西在窗户里。。。

    推荐文章