GetAdornerLayer таинственным образом возвращает ноль - PullRequest
10 голосов
/ 14 июня 2010

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

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 ]

11 голосов
/ 13 августа 2012

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

В моем случае у меня был класс, основанный на 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>
8 голосов
/ 14 июня 2010

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

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

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

3 голосов
/ 05 августа 2010

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

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

...