Compartilhar via


Dicionários de recursos mesclados

Os recursos do WPF (Windows Presentation Foundation) dão 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 então ser compartilhados entre aplicativos e também são mais convenientemente isolados para localização.

Criar um dicionário mesclado

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

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

O ResourceDictionary elemento não possui 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. Além disso, o ResourceDictionary que introduz um dicionário de recursos mesclado não pode ter uma diretiva x:Key.

Normalmente, cada ResourceDictionary na coleção de MergedDictionaries especifica um Source atributo. O valor de Source deve ser um identificador uniforme de recurso (URI) que direciona para o local do arquivo de 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 ResourceDictionary que é especificado como um dicionário mesclado, como uma alternativa à especificação Sourceou além de quaisquer recursos incluídos na origem especificada. No entanto, esse não é um cenário comum. O cenário principal para dicionários mesclados é mesclar recursos de locais de arquivos externos. Se você quiser especificar recursos dentro da marcação de uma página, defina-os no principal ResourceDictionary e não nos dicionários mesclados.

Comportamento do dicionário combinado

Os recursos em um dicionário mesclado ocupam um local no escopo de pesquisa de recursos, que está logo depois do escopo do dicionário de recursos principal ao qual 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 MergedDictionaries coleção foi definida em XAML, a ordem dos dicionários mesclados na coleção é a ordem dos elementos, conforme fornecido na marcação. Se uma chave for definida no dicionário primário e também em um dicionário que foi mesclado, o recurso retornado virá do dicionário primário. Essas regras de escopo se aplicam igualmente a referências de recursos estáticos e referências de recursos dinâmicos.

Dicionários mesclados e códigos

Dicionários mesclados podem ser adicionados a um Resources dicionário por meio do código. O ResourceDictionary padrão, que inicialmente está vazio e existe para qualquer propriedade Resources, também possui uma coleção MergedDictionaries padrão, inicialmente vazia. Para adicionar um dicionário mesclado por meio do código, você obtém uma referência ao ResourceDictionary primário desejado, obtém o valor da propriedade MergedDictionaries, e chama Add no genérico Collection que está contido em MergedDictionaries. O objeto que você adiciona deve ser um novo ResourceDictionary.

No código, você não define a propriedade Source. Em vez disso, você deve obter um ResourceDictionary objeto criando um ou carregando um. Uma maneira de carregar um ResourceDictionary existente é chamar XamlReader.Load em um fluxo de arquivo XAML existente que tenha uma ResourceDictionary raiz e, em seguida, converter o valor retornado em ResourceDictionary.

URIs de dicionário mescladas

Há várias técnicas para incluir um dicionário de recursos mesclado, que são indicadas pelo formato URI (uniform resource identifier) que você usa. Em termos gerais, essas técnicas podem ser divididas em duas categorias: recursos compilados como parte do projeto e recursos que não são compilados como parte do projeto.

Para recursos 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. Seu recurso deve ser definido como parte do projeto como uma ação de build do Resource. Se você incluir um arquivo .xaml de recurso no projeto como Recurso, não precisará copiar o arquivo de recurso para o diretório de saída, o recurso já está incluído no aplicativo compilado. Você também pode usar a ação de compilação de conteúdo, mas deve então copiar os arquivos para o diretório de destino e também implantar os arquivos de recurso na mesma relação de caminho do executável.

Observação

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

Uma técnica relacionada é usar um URI do Pack para um arquivo XAML e fazer referência a ele como Origem. O URI do pacote permite referências a componentes de assemblies referenciados e outras técnicas. Para obter mais informações sobre URIs do Pacote, consulte O Recurso de Aplicativo do WPF, o Conteúdo e os Arquivos de Dados.

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

Reutilização de 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 de recurso uniforme) válido. Exatamente como você faz isso depende da estratégia de implantação do aplicativo e de qual modelo de aplicativo você segue. A estratégia de URI do Pack mencionada anteriormente fornece uma maneira de normalmente disponibilizar um recurso mesclado em vários projetos durante o desenvolvimento por meio do compartilhamento de 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 fazer referência a recursos mesclados por meio de um URI distribuído que usa o protocolo http: .

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

Localização

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

Consulte também