我正在尝试为我的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实例放入顶级窗口?或者我是否需要以某种方式自己定义图层?挖掘文档让我无处可去。
谢谢!
答案 0 :(得分:17)
AdornerLayer
和AdornerDecorator
类都会生成ScrollContentPresenter
。如果在可视化树中没有这些类中的任何一个都是您控制的父级,那么它将没有关联的AdornerLayer
。
您可以向AdornerDecorator
添加UserControl
,但这样可确保您的Adorners
仅位于UserControl
后代的控件之上。
窗口的默认ControlTemplate
包含AdornerDecorator
,因此如果您将UserControl
添加到窗口,则应该获得AdornerLayer
。
答案 1 :(得分:0)
这完全取决于您调用代码的位置以及控件所在的位置。在您提供的情况下,控件尚未通过InitializeComponent()方法实例化。你实际上必须将控件放在你的一个视图中,或者只是提前在XAML中声明它以便能够拉出AdornerLayer。