WPF装饰层何时首次可用?

10

我想给我的UserControl添加一个覆盖效果,我知道在WPF中这时需要使用adorner。但是我对它们的工作原理有些困惑。我认为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个回答

18
AdornerLayer 是由 AdornerDecoratorScrollContentPresenter 类生成的。 如果在包含控件的可视树中没有这些类,则它将没有关联的 AdornerLayer
您可以将 AdornerDecorator 添加到您的 UserControl 中,但这样做只会确保您的 Adorners 位于 UserControl 的后代控件之上。
窗口的默认 ControlTemplate 包括一个 AdornerDecorator,因此如果您将 UserControl 添加到窗口中,则应该获得 AdornerLayer

0

这完全取决于您在何处调用代码以及控件所在的位置。在您提供的情况下,控件尚未通过InitializeComponent()方法实例化。您实际上需要将控件放置在视图中的某个位置或者在XAML中预先声明它,以便能够获取AdornerLayer。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接