WPF 装饰层何时首次可用?
Posted
技术标签:
【中文标题】WPF 装饰层何时首次可用?【英文标题】:When does a WPF adorner layer first become available? 【发布时间】:2010-04-16 10:52:46 【问题描述】:我正在尝试向我的 UserControl 添加叠加效果,我知道这就是 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 实例放入*** Window 吗?还是我需要以某种方式自己定义图层?翻阅文档让我一无所获。
谢谢!
【问题讨论】:
【参考方案1】:AdornerLayer
由AdornerDecorator
和ScrollContentPresenter
类生成。如果在可视化树中没有这些类中的任何一个是您的控件的父级,那么它将没有关联的AdornerLayer
。
您可以将AdornerDecorator
添加到您的UserControl
,但这将确保您的Adorners
仅位于UserControl
的后代控件之上。
Window 的默认ControlTemplate
包含AdornerDecorator
,因此如果将UserControl
添加到Window,那么它应该得到AdornerLayer
。
【讨论】:
【参考方案2】:这完全取决于您调用代码的位置以及控件所在的位置。在您提供的情况下,该控件尚未通过 InitializeComponent() 方法实例化。实际上,您必须将控件放在您的一个视图中的某个位置,或者只是提前在 XAML 中声明它才能拉出 AdornerLayer。
【讨论】:
以上是关于WPF 装饰层何时首次可用?的主要内容,如果未能解决你的问题,请参考以下文章