Когда делает WPF adorner, слой сначала становятся доступными?

Я пытаюсь добавить эффект наложения к своему UserControl, и я знаю, что это - то, для чего используются adorners в 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 в Окно верхнего уровня сначала? Или я должен определить слой сам так или иначе? Рытье через документацию не получило меня нигде.

Спасибо!

10
задан aoven 16 April 2010 в 10:52
поделиться

2 ответа

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

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

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

17
ответ дан 3 December 2019 в 21:20
поделиться

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

0
ответ дан 3 December 2019 в 21:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: