Compartilhar via


Contexto de esquema XAML padrão e contexto de esquema XAML do WPF

Um contexto de esquema XAML é uma entidade conceitual que qualifica como uma produção XAML que usa um vocabulário XAML específico interage com o comportamento de escrita de objeto, incluindo como o mapeamento de tipo é resolvido, como os assemblies são carregados, como determinadas configurações de leitor e gravador são interpretadas. Este tópico descreve os recursos dos Serviços XAML do .NET e o contexto de esquema XAML padrão associado, que se baseia no sistema de tipos CLR. Este tópico também descreve o contexto de esquema XAML usado para WPF.

Contexto de esquema XAML padrão

Os Serviços XAML do .NET implementam e usam um contexto de esquema XAML padrão. O comportamento de contexto de esquema XAML padrão nem sempre é totalmente visível na API da classe XamlSchemaContext. No entanto, em muitos casos, o comportamento que o contexto de esquema XAML padrão influencia é observável por meio da API comum do sistema de tipos XAML, como membros de XamlMember ou XamlType, ou por meio de APIs expostas em leitores XAML e gravadores XAML que estão usando o contexto de esquema XAML padrão.

Você pode criar um XamlSchemaContext que encapsula o comportamento padrão chamando o construtor XamlSchemaContext. Isso cria explicitamente o contexto de esquema XAML padrão. O mesmo contexto de esquema XAML padrão é criado implicitamente, se você inicializar um leitor XAML ou um gravador XAML usando APIs que não usam explicitamente um parâmetro de entrada XamlSchemaContext.

O contexto de esquema XAML padrão depende da reflexão CLR para seu comportamento de mapeamento de tipo. Isso inclui examinar o TypeCLR definidor e PropertyInfo ou MethodInforelacionados. Além disso, a atribuição clr em tipos ou membros é usada para preencher as especificidades para informações de tipo XAML ou membro XAML que usa o tipo de suporte CLR. O contexto de esquema XAML padrão não requer técnicas de extensão do sistema de tipo, como o padrão Invoker, porque as informações necessárias estão disponíveis no sistema de tipos CLR.

Para a lógica de carregamento de assembly, o contexto de esquema XAML padrão depende principalmente de quaisquer valores de assembly fornecidos em mapeamentos de namespace XAML. Além disso, LocalAssembly pode sugerir um assembly a ser carregado, para cenários como o carregamento de tipos internos.

Contexto do esquema XAML do WPF

O contexto do esquema XAML do WPF é descrito neste tópico porque a implementação do WPF fornece uma ilustração interessante dos tipos de recursos que podem ser introduzidos implementando um contexto de esquema XAML não padrão. Além disso, o conceito de contexto de esquema XAML não é muito discutido na documentação do WPF que trata do WPF XAML; o comportamento habilitado pelo contexto do esquema XAML só poderá ser totalmente compreensível se integrado a uma discussão sobre como o contexto de esquema XAML padrão funciona. O contexto do esquema XAML do WPF implementa o comportamento a seguir.

Substituições de pesquisa: WPF tem alguns modelos de conteúdo para XAML em que há propriedades de conteúdo XAML que funcionam sem serem ContentPropertyAttribute atribuídas. LookupContentProperty substituições para o WPF implementar esse comportamento.

Adiamento para expressões do WPF: WPF apresenta várias classes de expressão que adiam um valor até que um contexto de runtime esteja disponível. Além disso, a expansão do modelo é um comportamento de runtime que depende de técnicas de adiamento.

otimizações de pesquisa do sistema de tipo : WPF tem um extenso vocabulário XAML e um modelo de objeto, incluindo definições de membro de classe base que herdam literalmente centenas de classes definidas pelo WPF. Além disso, o próprio WPF é distribuído em vários assemblies. O WPF otimiza sua pesquisa de tipo usando tabelas de pesquisa e outras técnicas. Isso fornece melhorias de desempenho em relação ao contexto de esquema XAML padrão e sua pesquisa de tipo baseada em CLR. Nos casos em que os tipos não existem em uma tabela de pesquisa, o comportamento usa técnicas de contexto de esquema XAML semelhantes ao contexto de esquema XAML padrão.

extensão XamlType e XamlMember: WPF estende conceitos de propriedade com propriedades de dependência e conceitos de evento com eventos roteados. Para dar a esses conceitos maior visibilidade para operações de processamento XAML, o WPF estende XamlType e XamlMembere adiciona propriedades internas que relatam características de propriedade de dependência e evento roteado.

Acessando o contexto de esquema XAML do WPF

Se você estiver usando técnicas XAML baseadas no System.Windows.Markup.XamlReader ou System.Windows.Markup.XamlWriterdo WPF, o contexto de esquema XAML do WPF já estará em uso nessas implementações de leitor XAML e gravador XAML.

Se você estiver usando outras implementações de leitor XAML ou gravador XAML que não são inicializados com o contexto de esquema XAML do WPF, você poderá obter um contexto de esquema XAML do WPF em funcionamento de XamlReader.GetWpfSchemaContext. Em seguida, você pode usar esse valor como inicialização para outra API que usa um XamlSchemaContext. Por exemplo, você pode chamar XamlXmlReader para inicialização e passar o contexto de esquema XAML do WPF. Ou você pode usar o contexto de esquema XAML do WPF para operações do sistema de tipo XAML. Isso pode incluir a inicialização da construção de um XamlType ou XamlMemberou chamar XamlSchemaContext.GetXamlType.

Observe que, se você acessar determinados aspectos do XAML do WPF de uma perspectiva de fluxo de nó XAML pura, alguns dos recursos da estrutura do WPF talvez ainda não tenham agido. Por exemplo, os modelos do WPF para controles ainda não foram aplicados. Portanto, se você acessar uma propriedade que em tempo de execução pode ser preenchida com uma árvore visual completa, você poderá ver apenas um valor de propriedade que referencia um modelo. O contexto de serviço fornecido para extensões de marcação do WPF também pode não ser preciso se fornecido de uma situação de não runtime e pode resultar em exceções ao tentar gravar um grafo de objeto.

Carregamento de XAML e assembly

O carregamento de assembly para XAML e .NET XAML Services integra-se ao conceito de AppDomaindefinido por CLR. Um contexto de esquema XAML interpreta como carregar assemblies ou localizar tipos em tempo de execução ou tempo de design, com base no uso de AppDomain e outros fatores. A lógica é ligeiramente diferente dependendo se o XAML é XAML flexível para um leitor XAML, é compilado em uma DLL por XamlBuildTaskou é BAML gerado pelo PresentationBuildTaskdo WPF.

O contexto de esquema XAML para WPF integra-se ao modelo de aplicativo WPF, que, por sua vez, usa AppDomain, bem como outros fatores que são detalhes de implementação do WPF.

Entrada do leitor XAML (XAML flexível)

  1. O contexto do esquema XAML itera por meio do AppDomain do aplicativo, procurando um assembly já carregado que corresponda a todos os aspectos do nome, começando pelo assembly carregado mais recentemente. Se uma correspondência for encontrada, esse assembly será usado para resolução.

  2. Caso contrário, uma das seguintes técnicas com base no CLR Assembly API será usada para carregar um assembly:

XamlBuildTask

XamlBuildTask é usado para o Windows Communication Foundation (WCF) e o Windows Workflow Foundation.

Observe que as referências de assembly por meio de XamlBuildTask são sempre totalmente qualificadas.

  1. Chame Assembly.Load(String) no nome qualificado.

  2. Se a etapa anterior falhar, use o nome curto (e o token de chave pública, se presente) para chamar Assembly.Load(String).

BAML (PresentationBuildTask)

Há dois aspectos para carregar o assembly para BAML: carregar o assembly inicial que contém o BAML como um componente e carregar os assemblies de suporte de tipo para todos os tipos referenciados pela produção baml.

Carga de assembly para marcação inicial:

A referência ao assembly do qual carregar a marcação é sempre não qualificada.

  1. O contexto do esquema XAML do WPF itera por meio do AppDomain do aplicativo WPF, procurando um assembly já carregado que corresponda a todos os aspectos do nome, começando pelo assembly carregado mais recentemente. Se uma correspondência for encontrada, esse assembly será usado para resolução.

  2. Se a etapa anterior falhar, use o nome curto (e o token de chave pública, se presente) para chamar Assembly.Load(String).

Referências de assembly por tipos BAML:

As referências de assembly para tipos usados na produção baml são sempre totalmente qualificadas, como uma saída da tarefa de build.

  1. O contexto do esquema XAML do WPF itera por meio do AppDomain do aplicativo WPF, procurando um assembly já carregado que corresponda a todos os aspectos do nome, começando pelo assembly carregado mais recentemente. Se uma correspondência for encontrada, esse assembly será usado para resolução.

  2. Caso contrário, uma das seguintes técnicas é usada para carregar um assembly:

    • Chame Assembly.Load(String) no nome qualificado.

    • Se uma combinação de nome curto + token de chave pública corresponder ao assembly do qual o BAML foi carregado, use esse assembly.

    • Use o nome curto + token de chave pública para chamar Assembly.Load(String).

Consulte também