Я пытаюсь добавить эффект наложения к своему 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 в Окно верхнего уровня сначала? Или я должен определить слой сам так или иначе? Рытье через документацию не получило меня нигде.
Спасибо!
AdornerLayer
создается как AdornerDecorator
, так и ScrollContentPresenter
] классы. Если в визуальном дереве, являющемся родительским для вашего элемента управления, нет ни одного из этих классов, то у него не будет связанного AdornerLayer
.
Вы можете добавить AdornerDecorator
в свой UserControl
, но это гарантирует, что ваши Adorners
будут только поверх элементов управления, являющихся потомками ] UserControl
.
По умолчанию ControlTemplate
для окна включает в себя AdornerDecorator
, поэтому, если вы добавите UserControl
в окно, то он должен получить AdornerLayer
.
Все зависит от того, где вы вызываете код и где находится элемент управления. В случае, который вы указали, элемент управления еще не был создан с помощью метода InitializeComponent (). На самом деле вам придется разместить элемент управления где-нибудь в одном из ваших представлений или просто объявить его в XAML заранее, чтобы иметь возможность извлекать AdornerLayer.