为啥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 - 需要线程?

winform打开图片为啥会旋转90

为啥我的C#Winform自定义控件,继承Control类,然后重写onpaint事件,设计窗体拖动时只剩下外框!

VS2010 winform程序中的窗体文件如何查看设计

为啥 jQuery 选择器在这里不起作用?

为啥查询优化器在合并连接后使用排序?