Есть ли способ в WPF перечислить все файлы в определенном каталоге встроенных ресурсов? То есть каталог элементов, у которых для параметра «Действие сборки» установлено значение «Ресурс».
Перечисление файлов во встроенном каталоге ресурсов
Ответы (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
и т. д.