【问题标题】:WPF C# Reflection: Iterate over all resources with build action "Page"WPF C# 反射:使用构建操作“页面”迭代所有资源
【发布时间】:2017-11-23 15:18:59
【问题描述】:

我有一个包含很多 ResourceDictionaries 的 .dll。

所有这些 ResourceDictionaries 的 build action 都设置为 "Page"

在 Dll 中,我想找到所有这些 ResourceDictionaries 并对其进行迭代。

如果我将构建操作设置为“EmbeddedResource”,我可以使用反射:

var embeddedResources = Assembly.GetExecutingAssembly().GetManifestResourceNames().ToList();

但 GetManifestResourceNames()适用于具有构建操作“Page”的资源。

如何查找或遍历所有具有构建操作“页面”的资源?

解决方案不一定是反射。任何其他方式都非常受欢迎。

谢谢!

解决方案:

女士们先生们!我必须宣布,本周最佳人物和本次赏金的获胜者是 Jon Wu 先生。 Jon Wu 给出了正确的提示,通过搜索,我找到了这个解决方案:

Enumerating .NET assembly resources at runtime

工作代码,稍作改动如下:

public static string[] GetResourceNames()
    {
        var asm = Assembly.GetExecutingAssembly();
        string resName = asm.GetName().Name + ".g.resources";
        using (var stream = asm.GetManifestResourceStream(resName))
        using (var reader = new System.Resources.ResourceReader(stream))
        {
            return reader.Cast<DictionaryEntry>().Select(entry => (string)entry.Key).ToArray();
        }
    }

如果你调用这个方法,你会得到所有以“.baml”结尾的资源字符串,你可以遍历它们。

感谢 Jon Wu 的正确提示。

【问题讨论】:

  • 这是你的答案吗? stackoverflow.com/questions/3314140/…
  • @JohnPeters:不。正如我在问题中明确写的那样,GetManifestResourceNames() 仅适用于“EmbeddedResource”。它不适用于“页面”。
  • 所有“页面”标记的项目都将进入 &lt;WpfApplicationName&gt;.g.resources .NET 嵌入式资源,每个字典包含一个流。这些字典采用 BAML 格式 (en.wikipedia.org/wiki/…),所以我不确定这是否有用。枚举完这些 BAML 流后,您想做什么?
  • @SimonMourier:我使用“obj = Application.LoadComponent(uri);”将它们加载到 RAM 中。问题是,一旦将它们编译为 EmbeddedResource,如果 ResourceDictionaries 相互引用,这将不再起作用。对于引用,我的意思是使用 Uri-Packs 导入。例如:您有一个样式 RD,它从另一个 RD 导入颜色:.
  • 您应该告诉我们您只需要字典 names。我最初的评论首先给出了解决方案

标签: c# wpf resources buildaction


【解决方案1】:

根据this answer

页面(仅限 WPF):用于将 xaml 文件编译为 baml。然后使用与 Resource 相同的技术嵌入 baml(即作为 AppName.g.resources 提供)。

所以听起来您只需要寻找用YourAppName.g.resources 标识的资源。

【讨论】:

  • 女士们先生们!我必须宣布,本周的人物和本次赏金的获胜者是 Jon Wu 先生和 Thomas Levesque 先生。 Jon Wu 给出了正确的提示,通过搜索,我找到了这个解决方案:stackoverflow.com/questions/2517407/…。我已经添加了问题的解决方案。谢谢你,吴约翰!
  • 你得到了赏金,但按照规定,我要等2个小时,才能点击奖励按钮。
猜你喜欢
  • 2015-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
  • 2017-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多