侧边栏壁纸
博主头像
Tony's Blog博主等级

行动起来,coding

  • 累计撰写 83 篇文章
  • 累计创建 58 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录
c#

Wpf BUG_组件“XXX”不具有由 URI“XXX“识别的资源

Tony
2024-02-23 / 0 评论 / 0 点赞 / 5 阅读 / 4251 字

本文链接: https://blog.csdn.net/lishuangquan1987/article/details/123347719

版权

开发环境

VS2022+WPF+.Net6

Prism:8.1.97

HandyControl:3.3.0

错误截图:

1-oapi.png

错误的发生前的操作(100%出现)

1.在主窗体上点击菜单打开系统设置。

2.系统设置界面(另外一个Window)能正常显示。

3.关闭系统设置界面。

4.再次在主窗体上点击菜单打开系统设置

5.报错,报 组件“XXX”不具有由 URI“XXX"识别的资源

问题的奇怪之处是,第一次打开系统设置窗体没问题,第二次打开就报错

问题的解决

这个问题我遇到过好几次。检查代码没有发现错误。可能是微软的BUG

但是最后解决了。

尝试过的解决办法:

1.重新生成项目

2.关闭VS,删掉.vs文件,然后重新打开VS编译

3.将项目由AnyCPU改为x86

最终的解决办法

参考:https://stackoverflow.com/questions/7646331/the-component-does-not-have-a-resource-identified-by-the-uri

在项目中新建一个Extension.cs的类:

static class Extension
{
    public static void LoadViewFromUri(this FrameworkElement userControl, string baseUri)
    {
        try
        {
            var resourceLocater = new Uri(baseUri, UriKind.Relative);
            var exprCa = (PackagePart)typeof(Application).GetMethod("GetResourceOrContentPart", BindingFlags.NonPublic | BindingFlags.Static).Invoke(null, new object[] { resourceLocater });
            var stream = exprCa.GetStream();
            var uri = new Uri((Uri)typeof(BaseUriHelper).GetProperty("PackAppBaseUri", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null, null), resourceLocater);
            var parserContext = new ParserContext
            {
                BaseUri = uri
            };
            typeof(XamlReader).GetMethod("LoadBaml", BindingFlags.NonPublic | BindingFlags.Static).Invoke(null, new object[] { stream, parserContext, userControl, true });
        }
        catch (Exception)
        {
            //log
        }
    }
}

2.更改系统设置的后台代码如下:

/// <summary>
/// SystemSettingView.xaml 的交互逻辑
 /// </summary>
 public partial class SystemSettingView : Window
 {
     public SystemSettingView()
     {
         //InitializeComponent();
         this.LoadViewFromUri("/Test.Views.ClientUI;component/views/systemsettingview.xaml");
         this.DataContext=new SystemSettingViewModel();
     }
 }

根本原因

待找到后贴出来,初步断定是微软的BUG

可能的原因

1.跨程序集继承控件:https://www.cnblogs.com/lindexi/archive/2022/09/21/16714348.html。但是此类型的报错,在.Net7与.NetFramework 4.7.2都存在

0

评论区