11

アプリのいくつかのバージョンで同じコードを問題なく使用してきましたが、不思議なことNullRerefenceExceptionに次の s を受け取っています。

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

background単なるBorder要素です。

何が原因であるかについての私の2つの考えは、a).NET 4.0への切り替え、およびb)上記の要素( a )のインスタンスUserControlItemsControl.

奇妙なことに、これは常に発生するわけではなく、いつ発生するかを予測するのは難しいため、信頼できません。

4

3 に答える 3

13

私の場合、null に基づいて返さWindowれたクラスがありました。私の派生クラスの に が含まれていないGetAdornerLayer()ことが判明しました。それをトップレベルとして追加すると、問題は解決しました。ControlTemplateAdornerDecoratorControlTemplate

<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 を返します。

だから私の推測では、装飾層は存在しないということです...これが当てはまらないと信じる理由はありますか? ビジュアル ツリーに adorner レイヤーが存在することについて、現在どのような保証に依存していますか?

于 2010-06-14T16:44:27.157 に答える
4

これで本当に解決したのか気になります。AdornerDecorator は、その下の要素に AdornerLayer を提供します。すべてがその下になります。これはデコレータです。つまり、コンテンツである子を持っています。そのコンテンツは AdornerLayer で提供されています。したがって、XAML に AdornerDecorator を配置し、子が境界線である場合、境界線には AdornerLayer があります。

さらに、Window は AdornerDecorator をビジュアル ツリーの最上位として定義するため、Window 内のすべての要素はその上に AdornerLayer を持ちます。したがって、上記のコンテンツがウィンドウ内にある場合...

于 2010-08-04T20:27:24.007 に答える