将资源字典文件动态加载到 wpf 应用程序时会出现错误

本文关键字:应用程序 错误 wpf 字典 资源 文件 动态 加载 | 更新日期: 2023-09-27 17:56:34

我正在尝试使用该语句动态添加 xaml 资源文件,

Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("resources/leaf_styles.xaml", UriKind.Relative) });

这将引发异常,找不到资源"资源/leaf_styles.xaml"。

我将 leaf_styles.xaml 文件添加到资源文件夹下的项目中,BuildAction 设置为"内容",CopyAlways 设置为 True。我仍然收到此错误。有人可以帮助我指出问题所在吗?

附加信息 -

  • 我不想将 xaml 文件作为资源嵌入
  • 当前项目是一个 .net 3.5 类库项目
  • 上面的 mergedictionary 语句是写在属于同一项目的类中的
  • 我还手动添加了[程序集:AssemblyAssociatedContentFile("resources/leaf_styles.xaml")],一旦我认为这不起作用(用于测试)

更新

如果我把它作为一个绝对位置,它工作正常。

Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri(@"D:'foo'trunk'bin'resources'leaf_styles.xaml", UriKind.Absolute) });

将资源字典文件动态加载到 wpf 应用程序时会出现错误

终于,它奏效了。这是我所做的,

  1. 通过'http://msdn.microsoft.com/en-us/library/aa970069.aspx。
  2. 将 Uri 模式更改为

    var foo = new Uri("pack://siteoforigin:,,,/resources/leaf_styles.xaml", UriKind.RelativeOrAbsolute);
    Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = foo });
    

若要加载内容文件,可以调用应用程序类的 GetContentStream 方法,传递标识所需内容文件的包 URI。

收款处

http://msdn.microsoft.com/en-us/library/aa970494.aspx#Content_Files

编辑

我成功地做到了

    Uri uri = new Uri("Resources/MyDict.xaml", UriKind.Relative);
    StreamResourceInfo info = Application.GetContentStream(uri);
    System.Windows.Markup.XamlReader reader = new System.Windows.Markup.XamlReader();
    ResourceDictionary myResourceDictionary = 
                                   (ResourceDictionary)reader.LoadAsync(info.Stream);
    Application.Current.Resources.MergedDictionaries.Add(myResourceDictionary);

我遇到了同样的"缺少资源问题",挠了几个小时。然后我意识到我的程序集名称包含点 (.) 并更改了资源程序集名称,再次测试并正常工作。这是一个 16x16 png 图像文件,ı 想要加载。但是我看到虚线程序集名称会导致 soma 情况的错误,而不会在其他情况下导致错误。

  • 1)如果您从资源加载样式,它可以工作
  • 2)如果您正在加载图像,则它不起作用。找不到资源。

我在这两种情况下都使用相同的代码,但结果不同。我不知道这是否是 wpf 错误。