2010-06-14 3 views
10

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

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

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

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

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

ответ

8

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

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

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

+2

То же самое происходит, если я использую 'AdornerDecorator' вместо' Border', хотя я теперь вижу согласно MSDN это «Обеспечивает Adorner слой для элементов * под * его в визуальном дереве.» Позвольте мне попробовать обернуть границу в AdornerLayer ... – devios1

+0

Пока все хорошо, на самом деле. Извините за немой вопрос: $ – devios1

3

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

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

+2

Решение, которое в конечном итоге работало, состояло в том, чтобы просто положить «AdornerDecorator' * выше * (т. Е. В качестве родителя)« границы »в визуальном дереве. Это действительно было в окне, хотя и без хромированного, но, возможно, это проблема с .NET 4, потому что он отлично работал, не имея «AdornerDecorator» в .NET 3.5. – devios1

+0

У меня была такая же проблема. Я пытался украсить элементы управления, которые находились внутри окна, но GetAdornerLayer вернул null, независимо от того, что я пытался получить для слоя adorner. – kubal5003

9

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

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