+-

我面对一个事实,就是我不明白如何为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 - 乐贴网