该组件没有uri标识的资源

我想创build一个通用DataGrid在我所有的视图/用户控件上使用。

这是我的结构:

名为"Core" Class Library

称为"ViewBase"

 public class ViewBase : UserControl { public ViewBase() { } //Rest of Methods and Properties } 

称为"Controls" Class Library

UserControl被称为"GridView"

XAML:

  <vb:ViewBase x:Class="Controls.GridView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:vb="clr-namespace:Core;assembly=Core"> <Grid> <DataGrid></DataGrid> </Grid> </vb:ViewBase> 

代码背后:

 using Core; public partial class GridView : ViewBase { public GridView () { InitializeComponent(); } } 

然后是WPF应用程序称为“WPFApp”:

称为"View"

 using Controls; public class View : GridView { public View() { InitializeComponent(); } } 

我的整个想法是使用GridView ,我需要一个DataGrid

当我运行的应用程序,我得到这个错误:

 "The component 'WpfApp.View' does not have a resource identified by the URI '/Controls;component/GridView.xaml'." 

我究竟做错了什么?

这是正确的方法还是我的方式?

我做了一些非常相似的结果。 我有一个包含WPF控件的C#类库,名为UsageControl(带有xaml.cs文件的xaml)。 在一个单独的C#项目(即单独的DLL)中,我创build了一个inheritance自UsageControl的C# CPUUsageControl,但是将自己的旋转放在它上面。 当我尝试在我的一个视图上使用CpuUsageControl时,我得到了同样的错误。

我所做的修复是在我的独立程序集,而不是创build一个从基本控件inheritance的类,我创build了一个新的WPF控件包含基本控制。 然后,我把CpuUsage类中包含的所有逻辑放在WpfCpuUsageControl的代码后面。 我能够使用这个对象是我所有的其他控件就好了。

为了您的控件“GridView”,我将创build一个新的WPF用户控件 ,将其称为GridView,并使其包含一个“ViewBase”作为Grid控件的内容。ViewBase的内容放入DataGrid中,如下所示:

 <UserControl....> <Grid> <ViewBase name="vBase"> <DataGrid name="dGrid" /> </ViewBase> </Grid> </UserControl> 

我也不明白你需要ViewBase直接从UserControlinheritance。 如果你想让你的控件拥有某些属性和方法,那么为什么不只是创build一个BaseControl类(它不能从任何人inheritance而不是对象),并且将来的控件将inheritance它。 也许抽象的基类或接口是你所追求的。

对于MVVM WPF项目,我通常有一个BaseViewModel,它为我实现了INotifyPropertyChanged,所以我不必在任何地方都做同样的代码。

祝好运,我知道这个问题是一个巨大的痛苦,要弄清楚。 exception消息和谷歌是最无助的!

令人沮丧的是,我确实有这个错误,并且一直在努力解决这个问题。 对我来说,它曾经工作过,但后来我对派生的控件的XAML做了一些很小的改动,编译器开始给出这个错误信息。 简短的解决scheme,削减了很多小时试图弄清楚:closuresVisual Studio并重新打开它,重新编译,问题魔法般地消失了! (这是VS2012 Pro)刚刚添加了这个,以防万一任何人正在阅读圈子,试图find他们的代码不存在的问题。 首先可能值得尝试“IT人群解决scheme”。

你得到这个错误的原因是因为实现的InitializeComponent(在VS 2010中)将总是在派生类的程序集中search。

这里是InitializeComponent:

 /// <summary> /// InitializeComponent /// </summary> [System.Diagnostics.DebuggerNonUserCodeAttribute()] [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")] public void InitializeComponent() { if (_contentLoaded) { return; } _contentLoaded = true; System.Uri resourceLocater = new System.Uri("/WpfApplication1;component/mainwindow.xaml", System.UriKind.Relative); #line 1 "..\..\..\MainWindow.xaml" System.Windows.Application.LoadComponent(this, resourceLocater); #line default #line hidden } 

它查找您的XAML资源的行是System.Windows.Application.LoadComponent(this,resourceLocator)。 而这最有可能失败,因为等同于'this.GetType()。Assembly'用于确定哪个程序集search由相对Uri标识的资源。 而'this.GetType()'确实得到了对象的派生types,而不是实现代码的类的types。

PS。 这是一个错误? 我不知道…

这让我头疼了3天! 我有一个类库中的XAML UserControl和从我的.exe项目中UserControl派生的类(只有C#)。 在我的MainWindow.xaml的xamldevise器中,当启动应用程序时,出现错误“组件没有uri标识的资源”。 “胡安·卡洛斯·吉隆”的答案终于让我find了解决办法:

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Navigation; using System.Reflection; using System.IO.Packaging; using System.Windows.Markup; namespace ClassLibrary1 { static class Extension { public static void LoadViewFromUri(this UserControl 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 } } } } 

并从UserControl的.cs文件中调用它:

 namespace ClassLibrary1 { public partial class MyUserControl : UserControl { public MyUserControl() { //InitializeComponent(); this.LoadViewFromUri("/ClassLibrary1;component/myusercontrol.xaml"); } } } 

再次感谢“Juan CarlosGirón”!

我通过放置来解决这个问题

 myusercontrol = Activator.CreateInstance<myusercontrol>(); 

InitializeComponent();之前包含usercontrol的窗口的构造函数中InitializeComponent(); 线

  • 删除obj文件夹
  • 删除bin文件夹
  • 重build解决scheme

为我工作!

另外,如果您使用Assembly.LoadFile加载程序集,请检查AppDomain.CurrentDomain.GetAssemblies()以获取当前AppDomain中的重复程序集。 因为在WPF UserControl的自动生成代码中,组件将使用其相对URI加载。 而且由于在当前AppDomain中有重复的程序集,应用程序不知道使用哪一个。

使用Visual Studio 2013时收到相同的错误。

该组件没有uri标识的资源

尝试:
清理和重build解决scheme – 不起作用。
closures并打开Visual Studio – 没有工作。

解:
进入项目bin目录并清除所有文件。
再次运行项目,工作正常。

打开将在解决scheme的根目录中打开的软件包pipe理器控制台 ,然后运行以下PowerShell命令:

 Get-ChildItem -inc bin,obj -recurse | Remove-Item -recurse -force -EA SilentlyContinue 

你可以试试这个方法

我创build了我自己的InitializeComponent() ,我这样调用

 this.LoadViewFromUri("/NameOfProject;component/mainwindow.xaml"); public static void LoadViewFromUri(this Window window, 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, window, true }); } catch (Exception) { //log } } 

这里同样的问题。

简洁版本:

复制本地必须设置为False

长版本:

我们开发了一个WPF解决scheme(MVVM,20个项目),并实现了一个插件系统。 我们的/ bin / Debug目录包含可执行文件,一些dll文件和一个包含插件的插件目录。 有一个项目“DialogLib”(类库,types的对话框),它定义了一个窗口(视图),ViewModel,Model和一些接口。 其中一个插件使用了DialogLib的一个接口。 窗口本身由主应用程序打开。

要使用插件中的“DialogLib”库的接口,我们必须将DialogLib的项目引用添加到插件项目引用。 当应用程序启动时,插件被加载。 如果用户然后select一个菜单项,窗口应该打开。 在这个时候,当后面的代码试图执行它的InitializeComponent()时,出现错误“…组件没有URI标识的资源…”。

问题在哪里?

问题是,当我们构build解决scheme时,VS已经正确创build了DialogLib.dll并将其复制到/ bin / Debug /中。 这是因为主应用程序文件想要打开窗口。 但是DialogLib.dll也被复制到/ bin / Debug / plugins中,因为其中一个插件引用它来使用DialogLib.dll中定义的一个接口。 所以呢?

当插件在运行时加载时,它使用/bin/Debug/plugins/DialogLib.dll中定义的接口。 主应用程序文件试图打开/bin/Debug/DialogLib.dll中定义的窗口。 虽然文件是相同的,VS遇到麻烦。 设置插件引用的DialogLib引用属性的复制本地值可避免将DialogLib.dll复制到/ bin / Debug / plugins,从而解决问题。

在另一个项目中,我们有一个类似的问题(但不同的错误),我们想要使用typesTypeA ,这是在dll文件,插件和主应用程序中定义的。 Copy Local设置为true ,导致dll文件的副本位于../bin/Debug/plugins../bin/Debug/中 。 事实certificate,即使它是相同的dll文件,主应用程序文件中的TypeA和插件中的TypeA也分别作为不能交换的types处理。

@威廉,这对我来说似乎完全合适。 事实上,我试过这个,它在我的情况下工作。 我用ListBox而不是DataGrid (但不应该)。

我所有的命名空间都在一个程序集中。 所以我使用了一个共同的父命名空间,例如

MyWpfApplication.Controls MyWpfApplciation.GridView MyWpfApplciation.ViewBase

因为所有这些ControlsGridViewViewBase都与现有的基于SystemViewBase的命名空间和类声明冲突。 所以我确定我在我的项目中提到了正确的MyWpfApplication.*

重命名一个xaml文件后,我得到这个错误。 颠倒重命名解决了问题。

此外,我发现对App.xaml中xaml文件名的引用没有更新(StartupUri),但将其重命名为当前名称并不能解决问题(但也许它适合您)。 基本上,我不能重命名xaml文件。

Fyi,对我来说,错误中抱怨的部分是SplitComboBox。

当我在两个解决scheme中打开同一个项目时,碰到我。 在一个项目中修改基础控件会导致另一个项目出现此问题。 如果closures和打开不起作用,则删除“C:\ Users … \ AppData \ Local \ Microsoft \ VisualStudio \ 12.0 \ Designer \ ShadowCache”中的所有文件夹

closures并重新打开窗口时也会发生这种情况。 所以它也可能与包和/或dll无关。
我解决了这个问题,感谢由PainElemental发布的解决scheme,这是恕我直言低估:

 namespace MyNamespace { public partial class MyDialog : Window { public MyDialog(ExcelReference sheetReference) { this.LoadViewFromUri("/MyApp;component/mynamespace/mydialog.xaml"); } } } 

正如PainElemental写的,LoadViewFromUri是作为扩展实现的。 最疯狂的是,我也在同一个项目中写了其他窗口,没有遇到任何问题。
谢谢你,PainElemental,你结束了我的痛苦!

我也遇到了这个问题,没有任何inheritance问题。 我只是引用一个包含对话框的DLL,并尝试创build并显示该对话框。 我有程序集parsing器从一个特定的文件夹加载程序集,事实certificate,我已经在VS中添加了引用,并没有closures复制本地。 长话短说:我的进程已经加载了同一个DLL的两个版本。 这似乎混淆了WPF(或运行时)。 一旦我清除复制本地并删除额外的DLL副本,它再次正常工作。

比closures所有的Visual Studio更快只是为了杀死任务pipe理器中的XDescProc.exe。

XDescProc是devise师。 当进程closures的时候,你会看到在Visual Studio中重新加载devise器链接。 点击它,XDes将会重新启动,你的“无资源”错误应该消失。

杀死devise器进程之后,以下是visual studio显示的链接:

在这里输入图像说明

我意外地通过重命名 / 复制操作删除了一个用户控件。 当我从版本控制中恢复项目文件和xaml文件和.cs时,该错误开始发生在devise工作室中,该错误地被删除/重命名的控件。

这就提出了一些问题的文件caching….所以closuresVisual Studio,删除bin目录和重build工作。