6

我有问题

AdornerLayer AdornerLayer = AdornerLayer.GetAdornerLayer (layout);

此方法始终返回 null。

我究竟做错了什么?

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)
    {

    }
}
4

3 回答 3

10

The AdornerLayer for the Window won't be created until the window is actually loaded and the handle is created.

Instead of placing this in the constructor, you may need to delay, and add the adorner when the window is loaded instead.

于 2013-04-30T19:30:10.070 回答
0

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

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

于 2014-01-12T10:43:47.580 回答
0

AdornerLayer.GetAdornerLayerAdornerLayer在视觉树中向上搜索。

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

其他问题:

Layout layout = new Layout();
...
AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(layout);

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

要获得 Window's AdornerLayer,您需要在 Windows(不是 Window,因为 Window 它是顶部)中使用组合物。我的解决方案是将 XAML 'root' 中的第一个组合命名为:

AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(this.root);

编辑 :

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

//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);
}
于 2016-09-01T19:52:52.093 回答