GetAdornerLayer загадочно и возвращает значение null

я использовал один и тот же бит кода для нескольких версий моего приложения без проблем, но теперь я таинственно получаю NullRerefenceExceptions со следующим:

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

background это просто Border элемент.

мои две мысли о том, что может быть причиной этого: а) переключение на .NET 4.0 и Б) размещение экземпляров вышеуказанного элемента (который является UserControl) в ItemsControl.

странно, что это не происходит все время, и трудно предсказать, когда это будет случается, так что это ненадежно.

3 ответов


документы на AdornerLayer.GetAdornerLayer указать:

Если слои adorner не найдены, метод возвращает null.

поэтому я предполагаю, что нет слоев adorner... у вас есть основания полагать, что этого не должно быть дела? Какая гарантия в настоящее время вы полагаетесь на то, что в визуальном дереве будет слой adorner?


Я знаю, что это старый вопрос, но у меня была эта проблема сегодня.

в моем случае у меня был класс, основанный на 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>

Мне любопытно, действительно ли это было решено. AdornerDecorator предоставляет AdornerLayer для элемента под ним - и все будет под ним. Это декоратор, то есть у него есть ребенок, который является содержанием. Этот контент предоставляется с AdornerLayer. Так что, если вы положили AdornerDecorator в XAML и ребенок-это граница, граница есть AdornerLayer.

кроме того, Window определяет AdornerDecorator как верхнюю часть визуального дерева поэтому любой элемент в окне будет AdornerLayer над ним. Итак, если ваш конент наверху был в окне...