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