【问题标题】:When does a WPF adorner layer first become available?WPF 装饰层何时首次可用?
【发布时间】: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 吗?还是我需要以某种方式自己定义图层?翻阅文档让我一无所获。

谢谢!

【问题讨论】:

    标签: wpf user-controls adorner


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-09
        • 2011-05-17
        • 1970-01-01
        • 2012-02-05
        • 2011-03-14
        • 1970-01-01
        • 2012-10-17
        • 2016-11-24
        相关资源
        最近更新 更多