从不同的程序集加载合并的ResourceDictionary失败

我已将所有应用程序的ResourceDictionaries放入一个单独的程序集中,并将它们合并为一个ResourceDictionary,我希望将其作为资源包含在我的应用程序中:

          

声明资源:

    

在VS中查看设计器所有控件都显示文件中的样式,但是当我尝试启动应用程序时,我收到以下错误:

“找不到资源’inputstyles.xaml’。”

所有文件的构建操作都设置为“页面”,两个项目的构建都成功。 我究竟做错了什么?

如果您愿意做一些腿部工作, 则应将构建操作定义为资源或内容 。

您的资源必须作为资源构建操作定义为项目的一部分。 如果在项目中将资源.xaml文件作为资源包含在内,则无需将资源文件复制到输出目录,该资源已包含在已编译的应用程序中。 您还可以使用内容构建操作,但必须将文件复制到输出目录,并将资源文件以与可执行文件相同的路径关系部署。

从我的观察。 将资源dictonary构建样式设置为Resource可能会导致奇怪的错误(我突然开始遇到运行时错误Cannot create X ,其中X是我的资源字典中引用的用户定义类型)。

我建议将构建样式保留在Page 。 从我所见,这应该工作得很好。

有关WPF和合并资源字典中的 包URI的更多详细信息

构建动作应该是资源

当您了解外部Assembly结构(文件名等)以及何时不知道并且只想为ResourceDictionary(s)UserControls迭代外部Assembly ,请参阅此解决方案 。

Both XMAL and C# solution.

更新

XAML方式: If you know the URI of the resource in an Assembly, then load it directly. Transform same syntax in XAML If you know the URI of the resource in an Assembly, then load it directly. Transform same syntax in XAML

 ResourceDictionary dictionary = new ResourceDictionary(); dictionary.Source = new Uri("pack://application:,,,/WpfControlLibrary1;Component/RD1.xaml", UriKind.Absolute); foreach (var item in dictionary.Values) { //operations } 

C#方式: If you only know the Assambly and don't know the Resources in it

 public ResourceDictionary GetResourceDictionary(string assemblyName) { Assembly asm = Assembly.LoadFrom(assemblyName); Stream stream = asm.GetManifestResourceStream(asm.GetName().Name + ".g.resources"); using (ResourceReader reader = new ResourceReader(stream)) { foreach (DictionaryEntry entry in reader) { var readStream = entry.Value as Stream; Baml2006Reader bamlReader = new Baml2006Reader(readStream); var loadedObject = System.Windows.Markup.XamlReader.Load(bamlReader); if (loadedObject is ResourceDictionary) { return loadedObject as ResourceDictionary; } } } return null; }