枚举嵌入式资源目录中的文件

Jor*_*dan 7 wpf resources enumerate

在WPF中,是否有一种方法可以枚举特定嵌入式资源目录中的所有文件?也就是说,所有项目的目录都具有设置为"资源"的"构建动作".

Cha*_*les 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();
}
Run Code Online (Sandbox Code Playgroud)

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

您需要知道的一件事是XAML文件被编译并给出扩展名BAML.所以,让我们说你有一堆资源字典的名称的文件夹下Themes/Theme1.xaml,Themes/Theme2.xaml等等,这些会被编译到您的组件Themes/Theme1.baml,Themes/Theme2.baml等等.