C# 在运行时合并WPF ResourceDictionary

C# 在运行时合并WPF ResourceDictionary,c#,wpf,xaml,resourcedictionary,C#,Wpf,Xaml,Resourcedictionary,我有一个WPF用户控件,它定义了一些默认样式和图像,我希望能够在运行时使用资源程序集中包含的自定义样式和图像覆盖这些样式和图像 样式和图像包含在名为Olbert.JumpForJoy.DefaultResources的程序集中名为DefaultResources.xaml的ResourceDictionary中: <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

我有一个WPF用户控件,它定义了一些默认样式和图像,我希望能够在运行时使用资源程序集中包含的自定义样式和图像覆盖这些样式和图像

样式和图像包含在名为Olbert.JumpForJoy.DefaultResources的程序集中名为DefaultResources.xaml的ResourceDictionary中:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    x:Name="J4JResources">

    <BitmapImage x:Key="J4JMessageBoxImage" UriSource="assets/j4jmsgbox.png" />
    <BitmapImage x:Key="J4JWizardImage" UriSource="assets/j4jtransparent.png" />
    <Color x:Key="J4JButton0Color">#bb911e</Color>
    <Color x:Key="J4JButton1Color">#252315</Color>
    <Color x:Key="J4JButton2Color">#bc513e</Color>
    <Color x:Key="J4JButtonHighlightColor">Orange</Color>

</ResourceDictionary>
但是创建ResourceDictionary时会引发异常。消息为“找不到资源'defaultresources.xaml'”

为了解决这个问题,我对uri定义做了很多调整,但都没有成功。资源程序集是版本化的,但无论我是否在uri定义中包含特定版本,都会出现相同的错误

如果有一种不同的方式将可选资源程序集合并到WPF项目中,我很想听听。如果能回答我的具体问题,我们也将不胜感激:)

更新

如果我尝试通过app.xaml执行此操作:

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="pack://application:,,,/Olbert.JumpForJoy.DefaultResources;component/DefaultResources.xaml" />
    <ResourceDictionary Source="NotifyIconResources.xaml"/>
</ResourceDictionary.MergedDictionaries>

我收到一个设计时错误“查找资源字典时出错…”

在我最初的方法中调用resAssembly.GetManifestResourceNames()表明这些资源确实存在于自定义程序集中。但它们显示在程序集的默认命名空间下:

Olbert.JumpForJoy.WPF.DefaultResources.xaml


这让我想知道,在定义Uri时,是否需要以某种方式指定该名称空间。

为了其他人解决这个问题,我发现了一个解决方案:问题是外部资源程序集的默认名称空间必须与该程序集的DLL的名称相同。如果名称不同,包Uri语法将失败


我在我的博客

上更详细地记录了这一点,如果你直接在
App.xaml中合并你的外部资源,是否会出现错误?非常抱歉,@Graviton:我的许多帖子都因为WordPress中的新Gutenberg编辑器(包括这里引用的那一个)而遭到破坏。不幸的是,我没有这篇文章的备份或其他来源。
<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="pack://application:,,,/Olbert.JumpForJoy.DefaultResources;component/DefaultResources.xaml" />
    <ResourceDictionary Source="NotifyIconResources.xaml"/>
</ResourceDictionary.MergedDictionaries>