Sistema de Gerenciamento de Recursos

O Sistema de Gerenciamento de Recursos tem recursos de tempo de compilação e tempo de execução. No momento da compilação, o sistema cria um índice de todas as diferentes variantes dos recursos que são empacotados com seu aplicativo. Esse índice é o Índice de Recursos do Pacote, ou PRI, e também está incluído no pacote do seu aplicativo. Em tempo de execução, o sistema detecta as configurações do usuário e da máquina que estão em vigor, consulta as informações no PRI e carrega automaticamente os recursos que são a melhor correspondência para essas configurações.

Arquivo PRI (Índice de Recursos de Pacote)

Cada pacote de aplicativo deve conter um índice binário dos recursos no aplicativo. Esse índice é criado no momento da compilação e está contido em um ou mais arquivos PRI (Índice de Recursos de Pacote).

  • Um arquivo PRI contém recursos de cadeia de caracteres reais e um conjunto indexado de caminhos de arquivo que se referem a vários arquivos no pacote.
  • Um pacote normalmente contém um único arquivo PRI por idioma, chamado resources.pri.
  • O arquivo resources.pri na raiz de cada pacote é carregado automaticamente quando o ResourceManager é instanciado.
  • Os arquivos PRI podem ser criados e despejados com a ferramenta MakePRI.exe.
  • Para o desenvolvimento de aplicativos típico, você não precisará MakePRI.exe porque ele já está integrado ao fluxo de trabalho de compilação do Visual Studio. E o Visual Studio dá suporte à edição de arquivos PRI em uma interface do usuário dedicada. No entanto, seus localizadores e as ferramentas que eles usam podem depender MakePRI.exe.
  • Cada arquivo PRI contém uma coleção nomeada de recursos, chamada de mapa de recursos. Quando um arquivo PRI de um pacote é carregado, o nome do mapa de recursos é verificado para corresponder ao nome do identificador do pacote.
  • Os arquivos PRI contêm apenas dados, portanto, eles não usam o formato PE (executável portátil). Eles são projetados especificamente para serem somente dados como o formato de recurso para Windows. Eles substituem os recursos contidos nas DLLs no modelo de aplicativo Win32.

Acesso da API UWP aos recursos do aplicativo

Funcionalidade básica (ResourceLoader)

A maneira mais simples de acessar os recursos do aplicativo programaticamente é usando o namespace Windows.ApplicationModel.Resources e a classe ResourceLoader. ResourceLoader fornece acesso básico a recursos de cadeia de caracteres do conjunto de arquivos de recursos, bibliotecas referenciadas ou outros pacotes.

Funcionalidade avançada (ResourceManager)

A classe ResourceManager (no namespace Windows.ApplicationModel.Resources.Core ) fornece informações adicionais sobre recursos, como enumeração e inspeção. Isso vai além do que a classe ResourceLoader fornece.

Um objeto NamedResource representa um recurso lógico individual com vários idiomas ou outras variantes qualificadas. Ele descreve a exibição lógica do ativo ou recurso, com um identificador de recurso de cadeia de caracteres, como Header1, ou um nome de arquivo de recurso, como logo.jpg.

Um objeto ResourceCandidate representa um único valor de recurso concreto e seus qualificadores, como a cadeia de caracteres "Hello World" para inglês ou "logo.scale-100.jpg" como um recurso de imagem qualificado específico para a resolução de escala 100 .

Os recursos disponíveis para um aplicativo são armazenados em coleções hierárquicas, que você pode acessar com um objeto ResourceMap . A classe ResourceManager fornece acesso às várias instâncias de ResourceMap de nível superior usadas pelo aplicativo, que correspondem aos vários pacotes do aplicativo. O valor MainResourceMap corresponde ao mapa de recursos do pacote do aplicativo atual e exclui todos os pacotes de estrutura referenciados. Cada ResourceMap é nomeado para o nome do pacote especificado no manifesto do pacote. Dentro de um ResourceMap há subárvores (consulte ResourceMap.GetSubtree), que contêm objetos NamedResource. As subárvores normalmente correspondem aos arquivos de recurso que contêm o recurso. Para obter mais informações, consulte Localizar cadeias de caracteres na interface do usuário e no manifesto do pacote do aplicativo e Carregar imagens e ativos personalizados para escala, tema, alto contraste e outros.

Veja um exemplo.

// using Windows.ApplicationModel.Resources.Core;
ResourceMap resourceMap =  ResourceManager.Current.MainResourceMap.GetSubtree("Resources");
ResourceContext resourceContext = ResourceContext.GetForCurrentView()
var str = resourceMap.GetValue("String1", resourceContext).ValueAsString;

Observação O identificador de recurso é tratado como um fragmento de URI (Uniform Resource Identifier), sujeito à semântica de URI. Por exemplo, GetValue("Caption%20") é tratado como GetValue("Caption "). Não use "?" ou "#" em identificadores de recursos, pois eles encerram a avaliação do caminho do recurso. Por exemplo, "MeuRecurso?3" é tratado como "MeuRecurso".

O ResourceManager não apenas dá suporte ao acesso aos recursos de cadeia de caracteres de um aplicativo, mas também mantém a capacidade de enumerar e inspecionar os vários recursos de arquivo. Para evitar colisões entre arquivos e outros recursos originados de dentro de um arquivo, todos os caminhos de arquivo indexados residem em uma subárvore ResourceMap "Arquivos" reservada. Por exemplo, o arquivo \Images\logo.png corresponde ao nome Files/images/logo.pngdo recurso .

As APIs StorageFile lidam de forma transparente com referências a arquivos como recursos e são apropriadas para cenários de uso típicos. O ResourceManager só deve ser usado para cenários avançados, como quando você deseja substituir o contexto atual.

ResourceContext

Os candidatos a recursos são escolhidos com base em um ResourceContext específico, que é uma coleção de valores de qualificador de recursos (idioma, escala, contraste e assim por diante). Um contexto padrão usa a configuração atual do aplicativo para cada valor de qualificador, a menos que seja substituído. Por exemplo, recursos como imagens podem ser qualificados para escala, que varia de um monitor para outro e, portanto, de uma exibição de aplicativo para outra. Por esse motivo, cada exibição de aplicativo tem um contexto padrão distinto. O contexto padrão para uma determinada exibição pode ser obtido usando ResourceContext.GetForCurrentView. Sempre que você recuperar um candidato a recurso, deverá passar uma instância ResourceContext para obter o valor mais apropriado para uma determinada exibição.

APIs importantes