Pergunta

Estou fazendo um aplicativo WPF que terá várias peles marcadas pelo nosso sistema de construção. Idealmente, gostaríamos que o aplicativo listasse as peles disponíveis, pois algumas compilações terão uma para muitas peles.

Em tempo de execução, existe uma maneira de enumerar todos os dicionários de recursos em uma pasta específica?

Quero evitar codificar os nomes de arquivos XAML no meu CodeBehind, pois essa é uma situação em mudança.

Foi útil?

Solução

Tipo de.

Você pode enumerar todos os arquivos BAML (compilados xaml) da seguinte forma:

  var resourcesName = assembly.GetName().Name + ".g";
  var manager = new System.Resources.ResourceManager(resourcesName, assembly);
  var resourceSet = manager.GetResourceSet(CultureInfo.CurrentUICulture, true, true);
  var allXamlFiles =
    from entry in resourceSet.OfType<DictionaryEntry>()
    let fileName = (string)entry.Key
    where fileName.EndsWith(".baml")
    select fileName.Substring(0, fileName.Length-5) + ".xaml";

Não há como saber quais são os recursos e quais são outros XAML, como Windows ou UserControls, sem realmente carregá -los. Portanto, a resposta para sua pergunta direta é "não", a menos que você carregue cada xaml que você encontra para verificar se é um recurso. Isso seria muito lento.

Por outro lado, se você estiver disposto a usar um esquema de nomenclatura para seus recursos, poderá enumerar todos os BAMLs em sua montagem e selecionar o que corresponder ao seu esquema de nomeação e confiar que são recursos. Basta estender a cláusula "Where" na consulta acima.

Portanto, a resposta é "mais ou menos".

Outras dicas

Aqui está uma solução que encontrei @ Microsoft

WPF envolve o ResourceDictionary No "Assembly.g.resources", podemos obter o nome do recurso "Assembly.g.resources" por GetManifestResourceNames(). Depois disso, podemos usar ResourceReader classe para ler o recurso do ResourceStream.

 foreach (string str in Application.ResourceAssembly.GetManifestResourceNames()){
txt.Text += str + "\n";
 {
  Stream st = Application.ResourceAssembly.GetManifestResourceStream(str);
  using (ResourceReader resourceReader = new ResourceReader(st))
  {
   foreach (DictionaryEntry resourceEntry in resourceReader)
   {
    txt.Text +="\t: "+ resourceEntry.Key + "\n";
   }
  }
 }
}

segunda resposta

Você pode usar Assembly.Load() para carregar o conjunto externo e ler os dicionários de recursos dele.

Assembly assembly = Assembly.Load("Assembly Name String"); 
foreach (string str in assembly.GetManifestResourceNames())
{
 {
  Stream st = assembly.GetManifestResourceStream(str);
  using (ResourceReader resourceReader = new ResourceReader(st))
  {
   foreach (DictionaryEntry resourceEntry in resourceReader)
   {
    .....
   }
  }
 }
}

Você pode adicionar o Recursos em tempo de execução.

Resources.MergedDictionaries.Add(...)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top