为啥winforms设计器在共享资源XDocument加载XML的情况下不显示UI?
Posted
技术标签:
【中文标题】为啥winforms设计器在共享资源XDocument加载XML的情况下不显示UI?【英文标题】:Why does winforms designer doesn't show UI in case of shared resources XDocument load XML?为什么winforms设计器在共享资源XDocument加载XML的情况下不显示UI? 【发布时间】:2021-02-22 02:57:03 【问题描述】:一开始我试着用一句话来解释。我有一个包含多个程序的解决方案,其中一个只是一个为“全局设置”提供 resource.xml 的项目。
蓝色的是我的winforms。
提供resource.xml的共享资源
Handler.cs 加载 xml,按名称获取所需的设置。我尝试了不同的方法来加载本地 resource.xml
public static XElement GetXElement(string name)
_cnt++;
// Option 1
//_xDoc = XDocument.Load(@"\resources.xml");
// Option 2
string appPath = Path.GetDirectoryName(Application.ExecutablePath);
//MessageBox.Show(appPath);
_xDoc = XDocument.Load(appPath + "\\resources.xml");
try
IEnumerable<XElement> ienuXel = from resource in _xDoc.Descendants("resource")
where resource.Attribute("name").Value.Equals(name)
select resource;
return ienuXel.Single();
catch (InvalidOperationException ex)
MessageBox.Show("SharedResources.Handler: " + "\n\n" + ex.Message, "InvalidOperationException", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
XElement xEL = new XElement("null");
return xEL;
每个其他项目都有“共享资源”-项目作为参考。
由于我将 GetXElement() 添加到构造函数中...
string _ACMXMLPath = SharedResources.Handler.GetXElement("strACMXMLPath").Value;
string _modifiedXMLpath = SharedResources.Handler.GetXElement("strmodifiedXMLpath").Value;
...winforms 设计器不再啰嗦了
顺便说一下,resource.xml 设置了属性“复制到输出目录”= 始终复制。
我猜,和那个路径C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE无关,因为没有DLL也没有PDB我的项目/解决方案。
【问题讨论】:
您可以将 XML 的构建操作指定为“嵌入式资源”并使用 GetMainfestResourceStream 访问它 您希望 XML 文件位于何处?当您从 VS 运行时,它是 c# 可执行文件所在的 bin 文件夹。尝试右键单击 XML 文件并选择属性。选择复制选项。 @prototype0815,有更新吗? 在 Form.Load 事件而不是构造函数中加载 xml。这样可以避免表单设计器出现问题。 【参考方案1】:根据我的测试,发现你在其他项目中使用xml文件的路径不正确。
您可以参考以下代码正确访问xml文件路径。
public class Handler
public static XElement GetXElement(string name)
Type t = typeof(Handler);
// get solution path
string solutionPath =Directory.GetParent(Directory.GetCurrentDirectory()).Parent.Parent.FullName;
string finalpath = Path.Combine(solutionPath,t.Namespace,"example.xml");
var _xDoc = XDocument.Load(finalpath);
try
IEnumerable<XElement> ienuXel = from resource in _xDoc.Descendants("resource")
where resource.Attribute("name").Value.Equals(name)
select resource;
return ienuXel.Single();
catch (InvalidOperationException ex)
MessageBox.Show("SharedResources.Handler: " + "\n\n" + ex.Message, "InvalidOperationException", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
XElement xEL = new XElement("null");
return xEL;
我在我的另一个 winform 应用程序中进行了测试。
private void button1_Click(object sender, EventArgs e)
string result = Handler.GetXElement("test1").Value;
MessageBox.Show(result);
xml文件及测试结果:
【讨论】:
以上是关于为啥winforms设计器在共享资源XDocument加载XML的情况下不显示UI?的主要内容,如果未能解决你的问题,请参考以下文章
通过 CLI 包装器在非托管 C++ 中使用 C#.NET Winform - 需要线程?