Перечисление файлов во встроенном каталоге ресурсов

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


person Jordan    schedule 21.02.2011    source источник


Ответы (1)


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

person Charles    schedule 03.03.2011