12 Stimmen

GetAdornerLayer gibt mysteriöserweise null zurück

Ich habe das gleiche Stück Code für mehrere Versionen meiner Anwendung ohne Probleme verwendet, aber jetzt erhalte ich auf mysteriöse Weise NullRerefenceException s mit den folgenden:

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

background ist nur eine Border Element.

Meine zwei Gedanken zu dem, was es verursachen könnte, sind a) das Wechseln zu .NET 4.0 und b) das Platzieren von Instanzen des obigen Elements (das ein UserControl ) in einer ItemsControl .

Seltsamerweise passiert das nicht immer, und es ist schwer vorherzusagen, wann es passiert, also ist es nicht zuverlässig.

14voto

Florian Lim Punkte 5302

In meinem Fall hatte ich eine Klasse, die sich auf Window y GetAdornerLayer() null zurück. Es stellte sich heraus, dass die ControlTemplate für meine abgeleitete Klasse enthielt nicht die AdornerDecorator . Das Hinzufügen dieser Ebene als oberste Ebene in der ControlTemplate das Problem gelöst.

<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>

8voto

Jon Skeet Punkte 1325502

Die Dokumentationen für AdornerLayer.GetAdornerLayer angeben:

Wenn keine Zierebenen gefunden werden, gibt die Methode null zurück.

Ich vermute also, dass es keine Zierebenen gibt... haben Sie irgendeinen Grund zu glauben, dass dies nicht der Fall sein sollte? Auf welche Garantie verlassen Sie sich derzeit, dass es im visuellen Baum eine Verzierungsebene geben wird?

4voto

Tony Brummel Punkte 41

Ich bin neugierig, ob das Problem wirklich gelöst wurde oder nicht. Ein AdornerDecorator stellt einen AdornerLayer für die darunter liegenden Elemente bereit - und alles wird darunter liegen. Es ist ein Dekorator, was bedeutet, dass er ein Kind hat, das der Inhalt ist. Dieser Inhalt wird mit einem AdornerLayer versehen. Wenn Sie also einen AdornerDecorator in Ihre XAML einfügen und das Child der Rahmen ist, hat der Rahmen einen AdornerLayer.

Außerdem definiert Window einen AdornerDecorator als Spitze des visuellen Baums, so dass jedes Element in einem Window einen AdornerLayer darüber hat. Wenn Ihr obiger Inhalt also in einem Fenster war...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X