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】:

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

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

Window 的默认ControlTemplate 包含AdornerDecorator,因此如果将UserControl 添加到Window,那么它应该得到AdornerLayer

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于WPF 装饰层何时首次可用?的主要内容,如果未能解决你的问题,请参考以下文章

没有事件传递给 WPF 装饰层

如何知道 CBPeripheral 何时不再可用

是否有回调用于告知用户位置何时可用

桌面应用程序如何知道服务器上的数据何时可用?

Comet 的框架何时可用?

隐藏和显示 swf 时如何判断 ExternalInterface 何时可用