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

13

我正在尝试使用以下语句动态添加一个XAML资源文件:

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

这里抛出了一个异常,无法找到资源'resources/leaf_styles.xaml'。

我将leaf_styles.xaml文件添加到项目的资源文件夹下,并将BuildAction设置为“Content”,CopyAlways设置为True。但我仍然遇到了这个错误。有人能告诉我问题出在哪里吗?

附加信息 -

  • 我不想将xaml文件嵌入为资源。
  • 当前项目是.net 3.5类库项目。
  • 上面的mergedictionary语句写在属于同一项目的类中。
  • 我还手动添加了[assembly: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) });

如果您提供绝对路径(仅用于测试),它是否有效? - Tim
是的,如果我给它一个绝对路径,它就能工作。Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri(@"D:\foo\trunk\bin\resources\leaf_styles.xaml", UriKind.Absolute) }); - sudarsanyes
3个回答

29

最后,它起作用了。这是我所做的:

  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 });
    

10

要加载内容文件,您可以调用Application类的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);

我不想将资源文件与程序集打包在一起,我想将其作为内容文件加载。 - sudarsanyes
GetContentStream 返回了“null”。我猜这可能与项目类型有关(!?) - sudarsanyes
我猜这与Uri有关。请检查您是否将构建操作设置为内容并将其复制到输出目录以始终进行复制。 - biju
当前项目是一个 .net 3.5 类库项目,这会引起任何困惑吗?! - sudarsanyes
不,我已经在一个3.5类库项目中尝试过了,它可以工作。这是我所做的。我创建了一个类库项目,添加了一个用户控件,并在用户控件的构造函数中编写了上述代码。我添加了system.xaml的引用。如果您能在测试项目中重现问题,请将其上传到某个地方并发布链接。我会检查相同的问题。 - biju

0

我遇到了同样的“缺少资源问题”,并为此苦恼了数小时。后来我意识到我的程序集名称包含点(.),于是更改了资源程序集名称,再次测试,问题得以解决。我想要加载的是一个16x16像素的png图像文件。但我发现,带有点的程序集名称会导致某些情况下出错,而在其他情况下则不会出错。

  • 1)如果您从资源中加载样式,则可以正常工作
  • 2)如果您加载图像,则无法正常工作。找不到该资源。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接