2010-04-16 42 views
9

我想添加覆盖效果到我的用户控件,我知道这是什么装饰用于WPF。但我对他们应该如何工作感到困惑。我认为adorner层是由WPF运行时隐式处理的,因此应始终可用。什么时候WPF装饰图层第一次变得可用?

但是,当我在代码中创建我的UserControl的实例时,那里没有装饰器层。以下代码失败,例外:

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实例放入顶层窗口?或者我需要以某种方式自己定义图层?通过文档挖掘让我无处可去。

谢谢!

回答

16

AdornerLayerAdornerDecoratorScrollContentPresenter类生成。如果在视觉树中没有父类控制的这些类,那么它将不会有关联的AdornerLayer

你可以添加一个AdornerDecoratorUserControl,但将确保您Adorners只对属于UserControl的后裔控制顶部。

窗口的默认ControlTemplate包含AdornerDecorator,所以如果将UserControl添加到窗口,则应该得到AdornerLayer

0

这一切都取决于您在哪里调用代码以及控件所在的位置。在你提供的情况下,控件尚未通过InitializeComponent()方法实例化。实际上,您必须将控件放置在您的某个视图的某个位置,或者只需在XAML中声明该控件即可提取AdornerLayer。