首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于面板中的所有控件,AdornerLayer.GetAdornerLayer()返回NULL

对于面板中的所有控件,AdornerLayer.GetAdornerLayer()返回NULL
EN

Stack Overflow用户
提问于 2013-06-25 10:05:07
回答 1查看 3.8K关注 0票数 3

我所面临的事实是,我无法很好地理解AdornerLayer是如何为UIElements添加的。

我有这样的情况:

我有一个WPF表单,它是由3个控件构建的:一个网格,其上有1个按钮和1个TextBox

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

代码语言:javascript
复制
 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>,其中所有控件都在Panel__中。

我有这样一个功能:刷新表单设计器。它为该窗体重新创建xaml。

在完成刷新之后,我将检查AdornerLayer控件的列表。对于所有控件,AdornerLayer为空。

问题就在这里,我不明白AdornerLayer在哪里丢失了?当我刷新表单的设计器时,应该注意为每个UIElement添加它们吗?

请给我一些建议。

谢谢!

编辑:--如果其他人遇到这样的问题,我将展示所有的解决方案:)

任务是:当设计器中有一个SelectedControl时,即使完成了一个RefreshDesigner,也要选择它。

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

代码语言:javascript
复制
// 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();
}

Firstly:表单的xaml通过使用XamlProviderParseXaml()方法进行更新

代码语言:javascript
复制
// 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官方来源

在此之后,所有元素都有AdornelLayer而不是Null,我可以在designer中为精确选择的控件设置Adorner边框。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-25 11:54:08

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17294422

复制
相关文章

相似问题

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