GetAdornerLayer таинственным образом возвращает ноль

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

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,

Как ни странно, это происходит не всегда, и трудно предсказать, когда это произойдет, поэтому это ненадежно.

4 ответа

Решение

Документы для AdornerLayer.GetAdornerLayer указывают:

Если никакие дополнительные слои не найдены, метод возвращает ноль.

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

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

В моем случае у меня был класс, основанный на Window а также GetAdornerLayer() вернулся ноль. Оказалось, что 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. Итак, если ваш конент выше был в окне...

Этот ответ может прийти поздно, но в любом случае...

В документации AdornerDecorators написано следующее:

Метод GetAdornerLayer возвращает значение null, если вы передаете элемент, у которого нет AdornerDecorator в качестве предка в его визуальном дереве.

Так что, возможно, вашbackgroundэлемент не был дочерним элементомAdornerDecorator?

Другие вопросы по тегам