Compartilhar via


Contexto do esquema XML padrão e contexto do esquema XAML 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 gravação 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 tipo CLR. Este tópico também descreve o contexto do 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 do esquema XAML padrão nem sempre é totalmente visível na API da XamlSchemaContext classe. No entanto, em muitos casos, o comportamento que o contexto de esquema XAML padrão influencia é observável por meio de API comum do sistema de tipo XAML, como membros de ou , ou XamlTypepor meio de APIs expostas em leitores XAML e gravadores XAML que estão usando o contexto de esquema XAML XamlMember padrão.

Você pode criar um XamlSchemaContext que encapsula o comportamento padrão chamando o XamlSchemaContext construtor. 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 gravador XAML usando APIs que não usam explicitamente um parâmetro de XamlSchemaContext entrada.

O contexto de esquema XAML padrão depende da reflexão CLR para seu comportamento de mapeamento de tipo. Isso inclui examinar o CLR Typedefinidor e o relacionado PropertyInfo ou MethodInfo. Além disso, a atribuição CLR em tipos ou membros é usada para preencher as especificidades do tipo XAML ou das informações de membro XAML que usam o tipo de backup CLR. O contexto de esquema XAML padrão não requer técnicas de extensão de sistema de tipo, como o Invoker padrão, porque as informações necessárias estão disponíveis no sistema de tipo 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, pode sugerir um assembly para carregar, LocalAssembly para cenários como carregar 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 pela implementação de 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 aborda o WPF XAML; o comportamento que o contexto do esquema XAML permite só pode ser totalmente compreensível se integrado a uma discussão de como o contexto do esquema XAML padrão funciona. O contexto do esquema XAML do WPF implementa o seguinte comportamento.

Substituições de pesquisa: o 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 WPF implementar esse comportamento.

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

Otimizações de pesquisa do sistema de tipos: o WPF tem um extenso vocabulário XAML e modelo de objeto, incluindo definições de membros de classe base que herdam literalmente centenas de classes definidas pelo WPF. Além disso, o próprio WPF está espalhado por várias montagens. 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 adiciona propriedades internas que relatam propriedades de dependência e XamlMembercaracterísticas de eventos roteados.

Acessando o contexto do esquema XAML do WPF

Se você estiver usando técnicas XAML baseadas no WPF ou System.Windows.Markup.XamlWriter, o contexto do esquema XAML do WPF System.Windows.Markup.XamlReader já está 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 inicializam com o contexto de esquema XAML do WPF, talvez seja possível obter um contexto de esquema XAML do WPF em funcionamento do XamlReader.GetWpfSchemaContext. Em seguida, você pode usar esse valor como inicialização para outras APIs que usam um XamlSchemaContextarquivo . Por exemplo, você pode chamar XamlXmlReader para inicialização e passar o contexto do esquema XAML do WPF. Ou você pode usar o contexto do esquema XAML do WPF para operações do sistema do tipo XAML. Isso pode incluir a inicialização de construção de um XamlType ou , ou XamlMemberchamando XamlSchemaContext.GetXamlType.

Observe que, se você acessar certos aspectos do WPF XAML a partir de uma perspectiva de fluxo de nó XAML puro, alguns dos recursos da estrutura do WPF podem ainda não ter agido. Por exemplo, os modelos WPF para controles ainda não foram aplicados. Assim, se você acessar uma propriedade que, em tempo de execução, pode ser preenchida com uma árvore visual completa, poderá ver apenas um valor de propriedade que faz referência a um modelo. O contexto de serviço fornecido para extensões de marcação WPF também pode não ser preciso se fornecido a partir de uma situação que não seja de tempo de execução e pode resultar em exceções ao tentar gravar um gráfico de objeto.

XAML e carregamento de assembly

O carregamento de assembly para Serviços XAML e .NET XAML integra-se ao conceito definido pelo CLR de AppDomain. 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 solto para um leitor XAML, é XAML compilado PresentationBuildTaskem uma DLL por , ou é BAML gerado por XamlBuildTaskWPF .

O contexto do esquema XAML para WPF se integra 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 solto)

  1. O contexto do esquema XAML itera pelo 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 baseadas na API CLR Assembly é usada para carregar um assembly:

XamlBuildTask

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

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

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

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

BAML (PresentationBuildTask)

Há dois aspectos no carregamento de montagem para BAML: carregar o conjunto inicial que contém o BAML como um componente e carregar os conjuntos de suporte de tipo para quaisquer tipos referenciados pela produção BAML.

Carga de montagem 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 pelo aplicativo WPF, procurando um assembly já carregado que corresponda a todos os aspectos do nome, começando pelo AppDomain 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 houver) para chamar Assembly.Load(String).

Referências de montagem por tipos de BAML:

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

  1. O contexto do esquema XAML do WPF itera pelo aplicativo WPF, procurando um assembly já carregado que corresponda a todos os aspectos do nome, começando pelo AppDomain 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 será usada para carregar um assembly:

    • Chame Assembly.Load(String) o 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 nome curto + token de chave pública para chamar Assembly.Load(String).

Confira também