GetAdornerLayer загадочно и возвращает значение null
я использовал один и тот же бит кода для нескольких версий моего приложения без проблем, но теперь я таинственно получаю 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 ответов
документы на 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 над ним. Итак, если ваш конент наверху был в окне...