7

在 WPF 中,有没有办法枚举特定嵌入资源目录中的所有文件?即,所有具有“构建操作”设置为“资源”的项目的目录。

4

1 回答 1

15

这些资源被编译成一个名为 的资源流YourAssemblyName.g.resources。所以,我们加载这个流,它看起来是一个字典,其中键是资源名称,值是资源数据。我们对资源名称感兴趣,因为它(通常)是资源的原始文件夹和文件名。然后我们过滤掉那些以我们感兴趣的文件夹开头的键。

public static string[] GetResourcesUnder(string folder)
{
    folder = folder.ToLower() + "/";

    var assembly       = Assembly.GetCallingAssembly();
    var resourcesName  = assembly.GetName().Name + ".g.resources";
    var stream         = assembly.GetManifestResourceStream(resourcesName);
    var resourceReader = new ResourceReader(stream);

    var resources =
        from p in resourceReader.OfType<DictionaryEntry>()
        let theme = (string)p.Key
        where theme.StartsWith(folder)
        select theme.Substring(folder.Length);

    return resources.ToArray();
}

LINQ 查询过滤掉所有以给定文件夹名称开头的资源键,并从键中删除文件夹名称。

您需要知道的一件事是 XAML 文件被编译并被赋予了 BAML 扩展名。Themes/Theme1.xaml因此,假设您在名为,等的文件夹下有一堆资源字典Themes/Theme2.xaml。这些将作为Themes/Theme1.baml,Themes/Theme2.baml等编译到您的程序集中。

于 2011-03-03T19:22:55.763 回答