Dicionários de recursos mesclados

Os recursos do Windows Presentation Foundation (WPF) oferecem suporte a um recurso de dicionário de recursos mesclado. Esse recurso fornece uma maneira de definir a parte de recursos de um aplicativo WPF fora do aplicativo XAML compilado. Os recursos podem ser compartilhados entre aplicativos e são também isolados de modo mais conveniente para localização.

Apresentando um dicionário de recursos mesclados

Na marcação, você pode usar a seguinte sintaxe para introduzir um dicionário de recursos mesclados em uma página:

<Page.Resources>
  <ResourceDictionary>
    <ResourceDictionary.MergedDictionaries>
      <ResourceDictionary Source="myresourcedictionary.xaml"/>
      <ResourceDictionary Source="myresourcedictionary2.xaml"/>
    </ResourceDictionary.MergedDictionaries>
  </ResourceDictionary>
</Page.Resources>

Observe que o ResourceDictionary elemento não tem uma diretiva x:Key, que geralmente é necessária para todos os itens em uma coleção de recursos. Mas outra ResourceDictionary referência dentro da MergedDictionaries coleção é um caso especial, reservado para esse cenário de dicionário de recursos mesclado. O ResourceDictionary que introduz um dicionário de recursos mesclados não pode ter uma diretiva x:Key. Normalmente, cada ResourceDictionary dentro da MergedDictionaries coleção especifica um Source atributo. O valor de deve ser um identificador de recurso uniforme (URI) que resolve para o local do arquivo de Source recursos a ser mesclado. O destino desse URI deve ser outro arquivo XAML, com ResourceDictionary como seu elemento raiz.

Observação

É legal definir recursos dentro de um que é especificado como um ResourceDictionary dicionário mesclado, seja como uma alternativa para especificar Source, ou além de quaisquer recursos incluídos da fonte especificada. No entanto, esse não é um cenário comum. O cenário principal para dicionários mesclados é mesclar recursos de locais de arquivo externo. Se você quiser especificar recursos dentro da marcação para uma página, normalmente deverá defini-los no principal ResourceDictionary e não nos dicionários mesclados.

Comportamento do dicionário mesclado

Os recursos em um dicionário mesclado ocupam um local no escopo de pesquisa de recurso que está logo após o escopo do dicionário de recursos principal no qual eles são mesclados. Embora uma chave de recurso deva ser exclusiva em qualquer dicionário individual, uma chave pode existir várias vezes em um conjunto de dicionários mesclados. Nesse caso, o recurso retornado virá do último dicionário encontrado sequencialmente na MergedDictionaries coleção. Se a coleção foi definida em XAML, a ordem dos dicionários mesclados na coleção é a MergedDictionaries ordem dos elementos, conforme fornecido na marcação. Se uma chave for definida no dicionário principal e também em um dicionário que foi mesclado, o recurso que será retornado virá do dicionário principal. Essas regras de escopo se aplicam igualmente para referências de recursos estáticos e referências de recursos dinâmicos.

Dicionários mesclados e código

Os dicionários mesclados podem ser adicionados a um dicionário Resources por meio do código. O padrão, inicialmente vazio ResourceDictionary que existe para qualquer Resources propriedade também tem uma propriedade de coleção padrão, inicialmente vazia.MergedDictionaries Para adicionar um dicionário mesclado por meio de código, você obtém uma referência ao primário ResourceDictionarydesejado, obtém seu MergedDictionaries valor de propriedade e chama Add o genérico Collection contido no MergedDictionaries. O objeto adicionado deve ser um novo ResourceDictionaryarquivo . No código, você não define a Source propriedade. Em vez disso, você deve obter um objeto criando um ou carregando um ResourceDictionary . Uma maneira de carregar um existente para chamar XamlReader.Load um fluxo de arquivos XAML existente ResourceDictionary que tenha uma ResourceDictionary raiz e, em seguida, converter o valor de XamlReader.Load retorno para ResourceDictionary.

URIs de dicionários de recursos mesclados

Há várias técnicas para incluir um dicionário de recursos mesclados, que são indicadas pelo formato URI (identificador uniforme de recursos) que você usará. Genericamente, essas técnicas podem ser divididas em duas categorias: recursos que são compilados como parte do projeto e recursos que não são compilados como parte do projeto.

Para obter recursos que são compilados como parte do projeto, você pode usar um caminho relativo que se refere ao local do recurso. O caminho relativo é avaliado durante a compilação. O recurso deve ser definido como parte do projeto como uma ação de build de recursos. Se incluir um arquivo .xaml de recurso no projeto como recurso, você não precisará copiar o arquivo de recurso no diretório de saída, pois o recurso já estará incluído no aplicativo compilado. Você também pode usar a ação de build de conteúdo, mas deve, em seguida, copiar os arquivos no diretório de saída e também implantar os arquivos de recursos na mesma relação de caminho para o executável.

Observação

Não use a ação de build do recurso inserido. A ação de compilação em si é suportada para aplicativos WPF, mas a resolução de Source não incorpora ResourceManagere, portanto, não pode separar o recurso individual fora do fluxo. Você ainda pode usar o Recurso Incorporado para outros fins, desde que também tenha usado ResourceManager para acessar os recursos.

Uma técnica relacionada é usar um URI de pacote para um arquivo XAML e fazer referência a ele como Source. O URI Pack permite referências a componentes de assemblies referenciados e outras técnicas. Para mais informações sobre URIs Pack, consulte Arquivos de recurso, conteúdo e dados do aplicativo WPF.

Para obter recursos que não são compilados como parte do projeto, o URI é avaliado no tempo de execução. Você pode usar um transporte comum de URI como arquivo: ou http: para fazer referência ao arquivo de recursos. A desvantagem de usar a abordagem de recursos não compilados é que o acesso ao arquivo: requer etapas adicionais de implantação e o acesso ao http: implica na zona de segurança da Internet.

Reutilizando dicionários mesclados

Você pode reutilizar ou compartilhar dicionários de recursos mesclados entre aplicativos, pois o dicionário de recursos a ser mesclado pode ser referenciado por meio de qualquer URI (identificador uniforme de recursos) válido. O modo exato de fazer isso depende de sua estratégia de implantação do aplicativo e qual modelo de aplicativo você segue. A estratégia do URI Pack mencionado fornece uma maneira comum de prover um recurso mesclado em vários projetos durante o desenvolvimento ao compartilhar uma referência de assembly. Nesse cenário, os recursos ainda são distribuídos pelo cliente e pelo menos um dos aplicativos deve implantar o assembly referenciado. Também é possível referenciar recursos mesclados pelo URI distribuído que usa o protocolo http.

Gravar dicionários mesclados como arquivos de aplicativo local ou para armazenamento local compartilhado é outro cenário de dicionário mesclado/implantação do aplicativo possível.

Localização

Se os recursos que precisam ser localizados forem isolados em dicionários mesclados em dicionários primários e mantidos como XAML solto, esses arquivos poderão ser localizados separadamente. Essa técnica é uma alternativa simples para localizar os assemblies satélite de recursos. Para detalhes, consulte Visão geral de globalização e localização do WPF.

Confira também