Перечисление файлов во встроенном каталоге ресурсов - PullRequest
7 голосов
/ 21 февраля 2011

Есть ли способ в WPF перечислять все файлы в определенном каталоге встроенных ресурсов? То есть каталог элементов, для которых "Build Action" имеет значение "Resource".

1 Ответ

14 голосов
/ 03 марта 2011

Ресурсы скомпилированы в поток ресурсов с именем 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 и т. Д.

...