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
?