gpt4 book ai didi

c# - AdornerLayer.GetAdornerLayer() 为面板中的所有控件返回 NULL

转载 作者:行者123 更新时间:2023-11-30 16:17:21 25 4
gpt4 key购买 nike

我面临的事实是我无法理解如何为 UIElement 添加 AdornerLayer。

我有这样的情况:

我有一个使用 3 个控件构建的 WPF 表单:一个 Grid,上面有 1 个 Button 和 1 个 TextBoxenter image description here

在我的系统中,当我点击打开这个表单时,所有 3 个元素都有 AdornerLayer not 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 为空。

问题就在这里,我无法理解 AdornerLayer(s) 丢失在哪里?当我刷新窗体的设计器时,我应该注意为每个 UIElement 添加它们吗?

请给我一些建议。

谢谢!


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

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

enter image description here

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();
}

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

// 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

关于c# - AdornerLayer.GetAdornerLayer() 为面板中的所有控件返回 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17294422/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com