Когда слой WPF Adorner впервые станет доступен? - PullRequest
10 голосов
/ 16 апреля 2010

Я пытаюсь добавить эффект наложения в свой UserControl, и я знаю, что это то, для чего используются украшения в WPF. Но я немного озадачен тем, как они предположительно работают. Я полагал, что уровень adorner неявно обрабатывается средой выполнения WPF и поэтому всегда должен быть доступен.

Но когда я создаю экземпляр моего UserControl в коде, там нет слоя adorner. Следующий код не выполняется с исключением:

var view = new MyUserControl();
var target = view.GetAdornerTarget(); // This returns a specific UI control.
var layer = AdornerLayer.GetAdornerLayer(target);
if (layer == null)
{
    throw new Exception("No adorner layer at the moment.");
}

Может кто-нибудь объяснить мне, как это должно работать? Нужно ли сначала помещать экземпляр UserControl в окно верхнего уровня? Или мне нужно самому как-то определить слой? Копание документации ни к чему не привело.

Спасибо!

Ответы [ 2 ]

17 голосов
/ 16 апреля 2010

AdornerLayer генерируется классами AdornerDecorator и ScrollContentPresenter. Если ни один из этих классов в визуальном дереве не является родительским для вашего элемента управления, то с ним не будет ассоциировано AdornerLayer.

Вы можете добавить AdornerDecorator к вашему UserControl, но это гарантирует, что ваши Adorners находятся только над элементами управления, которые являются потомками UserControl.

По умолчанию ControlTemplate для Окна включает AdornerDecorator, поэтому, если вы добавите UserControl в Окно, тогда оно должно получить AdornerLayer.

0 голосов
/ 16 апреля 2010

Все зависит от того, где вы вызываете код и где находится элемент управления. В предоставленном вами случае элемент управления еще не был создан с помощью метода InitializeComponent (). На самом деле вам придется поместить элемент управления где-то в одном из ваших представлений или просто объявить его в XAML заранее, чтобы иметь возможность получить AdornerLayer.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...