什么时候WPF装饰层首次可用?

时间:2010-04-16 10:52:47

标签: wpf user-controls adorner

我正在尝试为我的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 个答案:

答案 0 :(得分:17)

AdornerLayerAdornerDecorator类都会生成ScrollContentPresenter。如果在可视化树中没有这些类中的任何一个都是您控制的父级,那么它将没有关联的AdornerLayer

您可以向AdornerDecorator添加UserControl,但这样可确保您的Adorners仅位于UserControl后代的控件之上。

窗口的默认ControlTemplate包含AdornerDecorator,因此如果您将UserControl添加到窗口,则应该获得AdornerLayer

答案 1 :(得分:0)

这完全取决于您调用代码的位置以及控件所在的位置。在您提供的情况下,控件尚未通过InitializeComponent()方法实例化。你实际上必须将控件放在你的一个视图中,或者只是提前在XAML中声明它以便能够拉出AdornerLayer。