+-
CodeGo.net> AdornerLayer.GetAdornerLayer()为面板中的所有控件返回NULL
我面对一个事实,就是我不明白如何为UIElements添加AdornerLayer.

我有这样的情况:

我有一个WPF表单,其中包含3个控件:
一个包含1个按钮和1个TextBox的网格.

在我的系统中,当我单击以打开此表单时,所有3个元素的AdornerLayer都不为null.

 var controls = _frameworkElementProvider.GetUIElements(Content);
 var controlsWithAddorner = new List<FrameworkElement>();

 foreach (var control in controls) {
    var adornerLayer = AdornerLayer.GetAdornerLayer(control);
    if (adornerLayer != null) {
       controlsWithAddorner.Add(control);
    }
 }   

集合controlsWithAddorner包含我所有的3个控件.

方法GetUIElements(FrameworkElement parent)返回IEnumerable< FrameworkElement>.其中是面板中的所有控件.

我有这样的功能:
刷新表单设计器.这将为该表单重新创建xaml.

刷新完成后,我检查了AdornerLayer的控件列表.对于所有控件,AdornerLayer为null.

问题在这里,我无法理解丢失了AdornerLayer的地方?
刷新表单设计器时,应该注意在每个UIElement中添加它们吗?

请给我一些建议.

谢谢!

编辑:
如果其他人会遇到此类问题,我将展示所有解决方案:)

任务是:当设计器中有一个SelectedControl时,即使完成RefreshDesigner,也要使其保持选中状态.

RefreshDesigner功能会为整个表单重新创建xaml.

// Refresh the Designer
private void RefreshDesigner() {    
    Content = _xamlProvider.ParseXaml(_xaml.ToString());

    //Here was the Problem. All visual child elements of the Content wa not updated after xaml recreation.
    //By including that call -> solved the problem
    Content.UpdateLayout();
}

首先:通过使用XamlProvider中的ParseXaml()方法来更新表单的xaml

// in XamlProvider class 
public Panel ParseXaml(string xaml) {
    var regex = new Regex("<Grid ");
    const int first = 1;
    xaml = Regex.Replace(xaml, @"xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml""", string.Empty);
    xaml = Regex.Replace(xaml, @"xml:space=""preserve""", string.Empty);

    //...

    xaml = Regex.Replace(xaml, "<BindingGroup .*/>", string.Empty);

    var content = (Panel)XamlReader.Parse(xaml);
    return content;
}

其次:Content.UpdateLayout();
确保已正确更新此元素的所有可视子元素以进行布局.
MSDN Official source

之后,所有元素的AdornelLayer都不为Null,我可以为设计器中预先选定的控件设置Adorner Border.

最佳答案
刷新表单后,调用Content.UpdateLayout();.到确保内容的所有可视子元素均已正确更新以进行布局. MSDN official
点击查看更多相关文章

转载注明原文:CodeGo.net> AdornerLayer.GetAdornerLayer()为面板中的所有控件返回NULL - 乐贴网