我所面临的事实是,我无法很好地理解AdornerLayer是如何为UIElements添加的。
我有这样的情况:
我有一个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>,其中所有控件都在Panel__中。
我有这样一个功能:刷新表单设计器。它为该窗体重新创建xaml。
在完成刷新之后,我将检查AdornerLayer控件的列表。对于所有控件,AdornerLayer为空。
问题就在这里,我不明白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();
}Firstly:表单的xaml通过使用XamlProvider的ParseXaml()方法进行更新
// 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边框。
发布于 2013-06-25 11:54:08
刷新表单后,调用Content.UpdateLayout();以确保正确更新内容的所有可视子元素以进行布局。MSDN官员
https://stackoverflow.com/questions/17294422
复制相似问题