首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回null的GetAdornerLayer

返回null的GetAdornerLayer
EN

Stack Overflow用户
提问于 2013-05-01 03:23:51
回答 3查看 3.6K关注 0票数 6

我有一个问题

代码语言:javascript
复制
AdornerLayer AdornerLayer = AdornerLayer.GetAdornerLayer (layout);

此方法始终返回null。

我做错了什么?

代码语言:javascript
复制
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        Layout layout = new Layout();
        layout.Background = Brushes.White;
        layout.ClipToBounds = true;
        layout.SnapsToDevicePixels = true;
        layout.Width = 4965; layout.Height = 3515;

        AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(layout);
        adornerLayer.Add(new LayoutAdorner(layout));
    }
}


public class Layout : Canvas
{
    public Visual GetVisualChildAtPoint(Point point)
    {
        return VisualTreeHelper.HitTest(this, point).VisualHit as Visual;
    }
}

public class LayoutAdorner : Adorner
{
    public LayoutAdorner(UIElement adornedElement) : base(adornedElement) { }

    protected override void OnRender(DrawingContext drawingContext)
    {

    }
}
EN

回答 3

Stack Overflow用户

发布于 2013-05-01 03:30:10

在实际加载窗口并创建句柄之前,不会创建窗口的AdornerLayer

您可能需要延迟,并在加载窗口时添加装饰器,而不是将其放在构造函数中。

票数 10
EN

Stack Overflow用户

发布于 2014-01-12 18:43:48

刷新表单后,调用Content.UpdateLayout();以确保内容的所有可视子元素都针对布局进行了正确更新。MSDN Official

(我不是很聪明,我只是从这里复制了解决方案):AdornerLayer.GetAdornerLayer() return NULL for all controls in a Panel

票数 0
EN

Stack Overflow用户

发布于 2016-09-02 03:52:52

AdornerLayer.GetAdornerLayer在可视化树中向上搜索AdornerLayer

在构造函数中,可视化树不是组合的。您需要将代码放入Window.Loaded事件中。

其他问题:

代码语言:javascript
复制
Layout layout = new Layout();
...
AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(layout);

搜索是向上的。但是“布局”是顶部的(没有父级)。然后GetAdornerLayer返回null。

要获得窗口的AdornerLayer,您需要在窗口(而不是窗口,因为窗口是顶部)中获取一个合成器。我的解决方案是将XAML中的第一个composant命名为“root”:

代码语言:javascript
复制
AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(this.root);

编辑:

此方法可以从某些类型的WPF元素返回装饰层:

代码语言:javascript
复制
//If no adorner layer is found, return null
private static AdornerLayer GetAdornerLayer(Visual visual)
{
        var decorator = visual as AdornerDecorator;
        if (decorator != null)
            return decorator.AdornerLayer;
        var presenter = visual as ScrollContentPresenter;
        if (presenter != null)
            return presenter.AdornerLayer;
        var visualContent = (visual as Window)?.Content as Visual;
        return AdornerLayer.GetAdornerLayer(visualContent ?? visual);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16307474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档