我有一个问题
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)
{
}
}发布于 2013-05-01 03:30:10
在实际加载窗口并创建句柄之前,不会创建窗口的AdornerLayer。
您可能需要延迟,并在加载窗口时添加装饰器,而不是将其放在构造函数中。
发布于 2014-01-12 18:43:48
刷新表单后,调用Content.UpdateLayout();以确保内容的所有可视子元素都针对布局进行了正确更新。MSDN Official
(我不是很聪明,我只是从这里复制了解决方案):AdornerLayer.GetAdornerLayer() return NULL for all controls in a Panel
发布于 2016-09-02 03:52:52
AdornerLayer.GetAdornerLayer在可视化树中向上搜索AdornerLayer。
在构造函数中,可视化树不是组合的。您需要将代码放入Window.Loaded事件中。
其他问题:
Layout layout = new Layout();
...
AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(layout);搜索是向上的。但是“布局”是顶部的(没有父级)。然后GetAdornerLayer返回null。
要获得窗口的AdornerLayer,您需要在窗口(而不是窗口,因为窗口是顶部)中获取一个合成器。我的解决方案是将XAML中的第一个composant命名为“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);
}https://stackoverflow.com/questions/16307474
复制相似问题