Partilhar via


Extensões de marcação de visão geral do XAML

As extensões de marcação são uma técnica XAML para obtenção de um valor que não é um primitivo nem um tipo específico de XAML. Para o uso do atributo, extensões de marcação usam a seqüência de caracteres conhecidas de uma chave de abertura { para inserir o escopo de extensão de marcação e uma chave de fechamento } para sair. Ao usar.NET Framework XAML Services, você pode usar algumas das extensões de marcação de linguagem XAML predefinidas da montagem de System.Xaml. Você também pode subclasse a partir do MarkupExtension classe, definido em System.Xaml e definir suas próprias extensões de marcação. Ou você pode usar as extensões de marcação definidas por uma estrutura específica, se você já estiver consultando dessa estrutura.

Quando um uso de extensão de marcação é acessado, o gravador de objeto XAML pode fornecer serviços para um personalizado MarkupExtension classe por meio de uma conexão de serviço point-in a MarkupExtension.ProvideValue substituição. Os serviços podem ser usados para obter o contexto sobre o uso, recursos específicos do gravador de objeto, contexto de esquema XAML e assim por diante.

Este tópico contém as seguintes seções.

  • XAML-Defined Markup Extensions
  • A classe Base de MarkupExtension
  • A definição do tipo de suporte para uma extensão de marcação personalizada
  • Padrões de construtor e argumentos posicionais para uma extensão de marcação personalizada
  • Argumentos para uma extensão de marcação personalizada nomeados
  • Acessando o contexto de provedor de serviço a partir de uma implementação de extensão de marcação
  • Uso do elemento de propriedade de uma extensão de marcação
  • Atribuição de uma extensão de marcação personalizada
  • Serialização de usos da extensão de marcação
  • Extensões de marcação de fluxo XAML nó
  • Tópicos relacionados

XAML-Defined Markup Extensions

Várias extensões de marcação são implementadas.NET Framework XAML serviços, suporte a idioma XAML. Essas extensões de marcação correspondem às partes da especificação do XAML como uma linguagem. These are typically identifiable by the x: prefix in the syntax as seen in common usage. A.Implementações de serviços do NET Framework XAML para esses elementos de linguagem XAML derivam todas as MarkupExtension classe base.

Observação

O x: prefixo é usado para o mapeamento de namespace XAML típico do namespace de linguagem XAML, no elemento raiz de uma produção de XAML.Por exemplo, o Visual Studio modelos de projeto e página para várias estruturas específicas iniciar um arquivo XAML usando essa x: de mapeamento.Você pode escolher um token de prefixo diferente no seu próprio mapeamento de namespace XAML, mas esta documentação assumirá o padrão x: mapeamento como um meio de identificar essas entidades que fazem parte da linguagem XAML definida namespace XAML, em oposição ao namespace XAML padrão da estrutura de específicos ou outros arbitrário CLR ou XML namespaces.

x: tipo

x:Type supplies the Type object for the named type. Essa funcionalidade é usada com mais freqüência em mecanismos de adiamento que usam o tipo subjacente do CLR e digite derivação como um moniker de agrupamento ou um identificador. WPF estilos e modelos e seu uso de TargetType Propriedades, são um exemplo específico. For more information, see Marcação de Extensão x:Type.

x: estática.

x:Static produces static values from value-type code entities that are not directly the type of a property's value, but can be evaluated to that type. Isso é útil para especificar os valores que já existem como constantes conhecidas em uma definição de tipo. For more information, see Extensão de Marcação x:Static.

x: Null.

x:NullEspecifica null como um valor para um membro do XAML. Dependendo do design de tipos específicos ou em conceitos de estrutura maiores, null é nem sempre um valor padrão para uma propriedade ou o valor implícito de um atributo de seqüência de caracteres vazia. For more information, see Extensão de linguagem de marcação x:NULL.

x: matriz.

x:Arraysuporta a criação de matrizes gerais na sintaxe do XAML em casos onde o suporte a coleção, o que é fornecido por modelos de controle e de elementos base deliberadamente, não é usado. For more information, see x:Array de marcação de extensão. No XAML 2009 especificamente, arrays são acessados como primitivos de idioma em vez de como uma extensão. For more information, see Recursos de linguagem XAML 2009.

x: referência.

x:Referenceé parte do XAML de 2009, uma extensão do conjunto original de idioma de (2006). x:Referencerepresenta uma referência a outro objeto existente em um gráfico de objeto. Esse objeto é identificado por seu x:Name. For more information, see x: extensão de marcação de referência.

Outros x: Construções

Outros x: construções de recursos de linguagem XAML suporte existem, mas esses não são implementados como extensões de marcação. For more information, see Namespace XAML (x:) Recursos da linguagem.

A classe Base de MarkupExtension

Para definir uma extensão de marcação personalizada que pode interagir com as implementações padrão de leitores XAML e gravadores XAML no System.Xaml, você deriva uma classe abstrata MarkupExtension classe. Se a classe tem um método para substituir, que é ProvideValue. Talvez você precise definir construtores adicionais para oferecer suporte a argumentos para o uso de extensão de marcação e propriedades definíveis de correspondência.

Por meio de ProvideValue, uma extensão de marcação personalizada tem acesso a um contexto de serviço que informa que o ambiente onde a extensão de marcação realmente é invocado por um processador XAML. No caminho de carga geralmente é um XamlObjectWriter. Em Salvar caminho geralmente é um XamlXmlWriter. Cada relatório, o contexto do serviço como um XAML serviço provedor contexto classe interna que implementa um padrão de provedor de serviço. Para obter mais informações sobre os serviços disponíveis e que eles representam, consulte Digite conversores e extensões de marcação XAML.

Sua classe de extensão de marcação deve usar um nível de acesso público; Processadores XAML sempre devem ser capazes de instanciar a classe de suporte da extensão de marcação para usar seus serviços.

A definição do tipo de suporte para uma extensão de marcação personalizada

Quando você usa.NET Framework XAML Services ou estruturas que se baseiam.NET Framework XAML Services, você tem duas opções para como nomear o tipo de suporte de extensão de marcação. O nome do tipo é relevante para como os criadores do objeto XAML tentarem acessar e chamar um tipo de suporte de extensão de marcação quando encontram um uso de extensão de marcação em XAML. Use uma das seguintes estratégias de nomes:

  • Nome o nome do tipo a ser uma correspondência exata para o token de uso de marcação XAML. Por exemplo, para oferecer suporte a uma {Collate ...} o uso da extensão, o nome do tipo de suporte Collate.

  • O nome do tipo a ser o token de seqüência de caracteres de uso mais o sufixo de nome Extension. Por exemplo, para oferecer suporte a uma {Collate ...} o uso da extensão, o nome do tipo de suporte CollateExtension.

A ordem de pesquisa é procurar o Extension-classe de suffixed nome do primeiro e, em seguida, procure o nome da classe sem a Extension sufixo.

Da perspectiva do uso de marcação, incluindo o Extension sufixo como parte de uso é válido. No entanto, isso se comporta como se Extension é realmente parte do nome da classe e gravadores de objeto XAML não conseguirá resolver uma classe de suporte de extensão de marcação para esse uso, se a classe de suporte não tinha o Extension sufixo.

O construtor padrão

Para extensão de marcação de todos os tipos de suporte, você deve expor um construtor público padrão. Um construtor padrão é necessário para qualquer caso em que um escritor de objeto XAML instancia a extensão de marcação de um uso do elemento de objeto. Com suporte para o uso do elemento de objeto é uma expectativa razoável para uma extensão de marcação, particularmente para serialização. No entanto, você pode implementar uma extensão de marcação sem um construtor público, se você pretende suportar os usos de atributo de extensão de marcação.

Se o uso de extensão de marcação não possuir argumentos, o construtor padrão é necessário para dar suporte ao uso.

Padrões de construtor e argumentos posicionais para uma extensão de marcação personalizada

Para uma extensão de marcação com o uso do argumento pretendido, os construtores públicos devem corresponder para os modos de uso pretendido. Em outras palavras, se a extensão de marcação é projetada para exigir um argumento posicional como um uso válido, você deve suportar um construtor público com um parâmetro de entrada usa o argumento posicional.

Por exemplo, suponha que o Collate a extensão de marcação é destinada ao suporte a apenas um modo onde há um argumento posicional que representa o seu modo, especificado como um CollationMode constante de enumeração. Nesse caso, deve ser um construtor da seguinte forma:

public Collate(CollationMode collationMode) {...}

Em um nível básico, os argumentos passados para uma extensão de marcação são uma seqüência de caracteres, porque eles estão sendo encaminhados de valores de atributos da marcação. Você pode fazer todas as seqüências de caracteres de argumentos e trabalhar com entrada nesse nível. No entanto, você tem acesso a determinados processamento que ocorre antes que os argumentos de extensão de marcação são passados para a classe de suporte.

O processamento conceitualmente funciona como se a extensão de marcação é um objeto a ser criado e, em seguida, os seus valores de membros são definidas. Cada propriedade especificada é avaliada semelhante a como um membro especificado pode ser definido em um objeto criado quando o XAML é analisado. There are two important differences:

  • Conforme observado anteriormente, um tipo de suporte de extensão de marcação não precisa ter um construtor padrão para ser instanciado em XAML. Construção do objeto é adiada até que seus argumentos possíveis na sintaxe do texto indexados e avaliados como argumentos posicionais ou nomeados e o construtor apropriado é denominado naquele momento.

  • Usos de extensões de marcação podem ser aninhados. A extensão de marcação mais interno será avaliada primeiro. Portanto, você pode assumir como um uso e declarar um dos parâmetros de construção para ser um tipo que requer um conversor de valor (como uma extensão de marcação) para produzir.

Uma dependência em tal processamento foi mostrada no exemplo anterior. A.O gravador de objeto XAML de serviços do NET Framework XAML processa os nomes de constantes de enumeração para valores enumerados em um nível nativo.

Sintaxe de texto de um parâmetro posicional de extensão de marcação de processamento também pode contar com um conversor de tipo que está associado com o tipo de argumento de construção.

Os argumentos são chamados argumentos posicionais, porque a ordem na qual os tokens de uso for encontrado corresponde à ordem posicional do parâmetro de construtor para o qual são atribuídos. Por exemplo, considere a seguinte assinatura de construtor:

public Collate(CollationMode collationMode, object collateThis) {...}

Um processador XAML espera dois argumentos posicionais para a extensão de marcação. Se houvesse um uso {Collate AlphaUp,{x:Reference circularFile}}, o AlphaUp token é enviado para o primeiro parâmetro e avaliado como um CollationMode enumeração denominada constante. O resultado da interno x:Reference é enviada para o segundo parâmetro e avaliado como um objeto.

No XAML a regras especificadas para a sintaxe de extensão de marcação e processamento, a vírgula é o delimitador entre os argumentos, sejam esses argumentos argumentos posicionais ou argumentos nomeados.

Duplicar aridade de argumentos posicionais

Se um gravador de objeto XAML encontra um uso de extensão de marcação com argumentos posicionais, e há vários argumentos de construtor pegará esse número de argumentos (aridade duplicado), que não é necessariamente um erro. O comportamento depende de uma configuração de contexto de esquema XAML personalizável, SupportMarkupExtensionsWithDuplicateArity. Se SupportMarkupExtensionsWithDuplicateArity é true, um gravador de objeto XAML não acionar uma exceção apenas por motivos de aridade duplicados. Comportamento além desse ponto não está estritamente definido. A suposição de design básico é que o contexto de esquema tem informações de tipo disponíveis para os parâmetros específicos e podem conversões explícitas de tentativa que coincidem com os candidatos duplicados para ver qual assinatura pode ser a melhor correspondência. Ainda pode ser lançada uma exceção se há assinaturas podem passar os testes que são impostos por esse contexto de esquema específico que está sendo executado em um gravador de objeto do XAML.

Por padrão, SupportMarkupExtensionsWithDuplicateArity é false em que o CLR baseado em XamlSchemaContext para.NET Framework XAML Services. Assim, o padrão XamlObjectWriter lança exceções se ele encontrar um uso de extensão de marcação onde há aridade duplicada em construtores de. o tipo de backup

Argumentos para uma extensão de marcação personalizada nomeados

Extensões de marcação, conforme especificado pelo XAML também podem usar um formulário de argumentos nomeados para uso. No primeiro nível do uso de token, a sintaxe de texto é dividido em argumentos. A presença de um sinal de igual (=) em qualquer argumento identifica um argumento como um argumento nomeado. Tais um argumento também é indexado em um par nome/valor. Nesse caso, o nome nomeia uma propriedade pública de definível do tipo de suporte da extensão de marcação. Se você pretende dar suporte ao uso do argumento nomeado, você deve fornecer essas propriedades definíveis públicas. As propriedades podem ser propriedades herdadas desde que eles permaneçam públicos.

Acessando o contexto de provedor de serviço a partir de uma implementação de extensão de marcação

Os serviços disponíveis são as mesmas para qualquer conversor de valor. A diferença é como o conversor de cada valor recebe o contexto do serviço. Acesso a serviços e os serviços disponíveis estão documentados no tópico Digite conversores e extensões de marcação XAML.

Uso do elemento de propriedade de uma extensão de marcação

Os cenários para usos da extensão de marcação destinam-se geralmente em torno de usando a extensão de marcação no uso do atributo. No entanto, também é potencialmente é possível definir a classe de backup para oferecer suporte ao uso do elemento de propriedade.

Para dar suporte ao uso de elemento de propriedade de sua extensão de marcação, defina um construtor público padrão. Isso deve ser um construtor de instância não é um construtor estático. Isso é necessário porque um processador XAML geralmente deve chamar o construtor padrão em qualquer elemento de objeto, que ele processa da marcação e isso inclui classes de extensão de marcação como elementos do objeto. Para cenários avançados, você pode definir os caminhos de construção de não-padrão para classes. (For more information, see Diretiva de x: FactoryMethod.) No entanto, você não deve usar esses padrões para fins de extensão de marcação porque isso torna a descoberta do padrão de uso muito mais difícil, tanto para designers para usuários de marcação bruto.

Atribuição de uma extensão de marcação personalizada

Para oferecer suporte a ambientes de design e a determinados cenários de gravador de objeto XAML, você deve atributo a um tipo de suporte de extensão de marcação com vários atributos CLR. Esses atributos informam o uso de extensão de marcação pretendido.

MarkupExtensionReturnTypeAttributerelatórios de Type tipo de informações sobre o objeto que ProvideValue retorna. Por sua assinatura pura, ProvideValue retorna Object. Mas vários consumidores podem informações de tipo de retorno de mais precisas. This includes:

  • Designers e IDEs, que pode ser capaz de fornecer o reconhecimento do tipo de suporte para usos da extensão de marcação.

  • Advanced implementações de SetMarkupExtension manipuladores de classes de destino, que podem depender de reflexão para determinar o tipo de retorno da extensão de marcação em vez de a ramificação específicos conhecidos MarkupExtension implementações pelo nome.

Serialização de usos da extensão de marcação

Quando um gravador de objeto XAML processa um uso de extensão de marcação e chamadas ProvideValue, o contexto para ele anteriormente, sendo um uso de extensão de marcação persiste no fluxo de nó de XAML, mas não no gráfico do objeto. No gráfico de objeto, somente o valor é preservado. Se você tiver os cenários de design ou outros motivos para fazer a persistência o uso de extensão de marcação original na saída serializada, você deve projetar sua própria infra-estrutura para os usos de extensão de marcação de controle do fluxo de nó XAML do caminho de carga. Você pode implementar o comportamento para recriar os elementos do fluxo de nó do caminho de carga e reproduzi-los para escritores de XAML para serialização de salvar o caminho, substituindo o valor na posição apropriada do fluxo de nó.

Extensões de marcação de fluxo XAML nó

Se você estiver trabalhando com um fluxo de nó XAML no caminho de carga, um uso de extensão de marcação é exibida no fluxo do nó como um objeto.

Se o uso de extensão de marcação usa argumentos posicionais, ela é representada como um objeto de iniciar com um valor de inicialização. Como uma representação de texto aproximada, o fluxo de nó é semelhante ao seguinte:

StartObject(XamlType é o tipo de definição da extensão de marcação, não seu tipo de retorno)

  StartMember(nome da XamlMember is _InitializationText)

    Value(o valor é os argumentos posicionais como uma seqüência, incluindo os delimitadores intermediários)

  EndMember

EndObject

Um uso de extensão de marcação com argumentos nomeados é representado como um objeto com os membros dos nomes relevantes, cada definida com valores de seqüência de caracteres de texto.

Na verdade, invocar o ProvideValue a implementação de uma extensão de marcação requer o contexto de esquema XAML porque requer o mapeamento de tipo e criando uma marcação extensão suporte ao tipo de instância. Isso é o motivo por que os usos da extensão de marcação são preservados dessa maneira no padrão.Fluxos de nó de serviços de estrutura XAML NET - a parte do leitor de um caminho de carga, geralmente não tem o contexto de esquema XAML necessário disponível.

Se você estiver trabalhando com um fluxo de nó XAML em Salvar no caminho, geralmente há nada presente em uma representação de gráfico de objeto que pode informar que o objeto para serializar originalmente foi fornecido por um uso de extensão de marcação e um ProvideValue resultado. Entrada de XAML de cenários que precisam para persistir os usos da extensão de marcação para negociação circular em enquanto também captura outras alterações no gráfico de objeto deve desenvolver suas próprias técnicas para preservar o conhecimento de um uso de extensão de marcação do original. Por exemplo, para restaurar os usos de extensão de marcação, talvez você precise trabalhar com o fluxo de nó de salvar o caminho para restaurar os usos da extensão de marcação ou executar algum tipo de mesclagem entre o XAML original e o XAML recuperado. Algumas estruturas de implementação de XAML, como o WPF usam tipos de intermediários (expressions) para ajudar a representar os casos onde os usos da extensão de marcação fornecidos os valores.

Consulte também

Referência

MarkupExtension

Conceitos

As extensões de marcação e o WPF XAML

Outros recursos

Digite conversores e extensões de marcação XAML