【问题标题】:Dynamically loading resource dictionary files to a wpf application gives an error将资源字典文件动态加载到 wpf 应用程序会出错
【发布时间】:2011-05-17 12:11:46
【问题描述】:

我正在尝试使用语句动态添加 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类库项目
  • 上面的合并字典语句写在同一个项目的一个类中
  • 我还手动添加了 [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) });

【问题讨论】:

  • 如果你给它一个绝对路径(仅用于测试)它是否有效?
  • 是的,如果我把它作为绝对路径,它就可以工作。 Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri(@"D:\foo\trunk\bin\resources\leaf_styles.xaml", UriKind.Absolute) });

标签: c# .net wpf xaml resourcedictionary


【解决方案1】:

终于成功了。这就是我所做的,

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

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

    我遇到了同样的“缺少资源问题”,并且挠了好几个小时。然后我意识到我的程序集名称包含点(。)并更改了资源程序集名称,再次测试并且它有效。这是我想要加载的 16x16 png 图像文件。但我看到点式程序集名称会导致 soma 情况下的错误,而不会导致其他情况下的错误。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-03
      • 1970-01-01
      • 1970-01-01
      • 2017-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多