Share via


Extensão de Marcação e XAML

Este tópico introduz o conceito de extensões de marcação para Extensible Application Markup Language (XAML),incluindo suas regras de sintaxe, objetivo e a modelo de objeto da classe que subjacente.

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

  • Processadores XAML e extensões de marcação
  • Sintaxe de Extensão de Marcação básica
  • Extensões de Marcação Específicos de WPF
  • Extensões de Marcação Definidas de XAML
  • Mais sobre Sintaxe de Extensão de Marcação
  • Tópicos relacionados

Processadores XAML e extensões de marcação

Um processador XAML é definido como qualquer programa que pode aceitar XAML como uma linguagem por suas especificações (seja por compilação ou pela interpretação) e pode produzir as classes resultantes para uso por um modelo de objeto de tempo de execução (também pelas especificações de XAML). Por padrão, tal processador irá tanto interpretar um valor de atributo como uma sequência de caracteres literal ou convertê-la em um objeto na base do tipo do atributo ou os tipos de conversores específicos para esse atributo. No entanto, há ocasionalmente situações onde outro comportamento é necessário. Por exemplo, um processador de XAML pode ser instruído de que um valor de um atributo em vez disso, deve ser uma referência a um objeto já construído ou um objeto estático. Ou um processador de XAML pode ser instruído para usar uma sintaxe que fornece argumentos não padrão para o construtor de um objeto, que é uma aberração do padrão especificado para o comportamento do processador de XAML .

Sintaxe de Extensão de Marcação básica

Uma extensão de marcação pode ser implementada para fornecer os valores de propriedades no uso de um atributo, propriedades no uso de um elemento de propriedade, ou ambos.

Quando usado para fornecer um valor de atributo, a sintaxe que distingue uma extensão de marcação para um processador de XAML é a presença de chaves de abertura e fechamento ({ e }). O tipo de extensão de marcação, é em seguida, identificado pelo token de sequência de caracteres imediatamente após a chave de abertura.

Quando usado na sintaxe de elemento de propriedade, uma extensão de marcação é visualmente o mesmo que qualquer Outros elemento usado para fornecer um valor de propriedade de elemento: a XAMLdeclaração de elemento que faz referência à classe de extensão de marcação sistema autônomo um elemento, entre colchetes angulares (<>).

Extensões de Marcação Específicos de WPF

As extensões de marcação mais comuns usadas na programação de WPF são aquelas que oferecem suporte às referências de recurso (StaticResource e DynamicResource) e aquelas que dão suporte a ligação de dados (Binding).

StaticResource fornece um valor para uma propriedade de XAML, substituindo o valor de um recurso já definido. Para obter detalhes, consulte:Extensão de marcação StaticResource.

DynamicResource fornece um valor para uma propriedade de XAML pelo adiantamento esse valor para ser uma referência a um recurso de tempo de execução. Uma referência de recurso dinâmico força uma nova pesquisa toda vez que tal recurso é acessado. Para obter detalhes, consulte:Extensão de marcação DynamicResource.

Binding fornece um valor vinculado de dados para uma propriedade, pelo contexto de dados que se aplica ao elemento. Esta extensão de marcação é relativamente complexa, porque ela permite uma sintaxe substancial embutido para especificar uma ligação de dados. Para obter detalhes, consulte:Ligação de marcação de extensão.

RelativeSource fornece informações de origem para um Binding que podem navegar em vários relacionamentos possíveis na árvore de elementos em tempo de execução. Isso fornece fontes especializadas para ligações que forem criadas em modelos de múltiplos usos ou criadas em código sem conhecimento completo da árvore de elementos ao redor. Para obter detalhes, consulte:MarkupExtension do RelativeSource.

TemplateBinding permite que um modelo de controle use valores para propriedades modeladas que vêm de propriedades definidas em modelo do objeto da classe que irá usar o modelo. Para obter detalhes, consulte:Extensão de linguagem de marcação TemplateBinding. Para obter mais informações sobre o uso prático de TemplateBinding, consulte Estilo com ControlTemplates exemplo.

Extensões de Marcação Definidas de XAML

Existem várias extensões de marcação que não são específicas de WPF aplicação de XAML, mas em vez disso, fazem parte da especificação do XAML sistema autônomo um linguagem. Essas são normalmente identificáveis pelo prefixo x: na sintaxe como visto em uso comum. The WPF implementação para esses elementos de linguagem usa o mesmo MarkupExtension classe base para fornecer a implementação.

ObservaçãoObservação:

O x: prefixo é usado para o mapeamento de namespace de XML típico da XAML espaço para nome, no elemento raiz de um XAML aplicativo ou documento. Por exemplo, os modelos Microsoft Visual Studio 2005 iniciam um arquivo XAML usando esse mapeamento x:. Você pode escolher um token de prefixo diferente em seu próprio mapeamento de namespace de XML, mas esta documentação presumirá o padrão de x: mapeamento sistema autônomo um meio de identificar essas entidades são uma parte definida das XAML espaço para nome, em vez da WPF espaço para nome ou outros namespaces CLR ou XML arbitrários.

x:Type fornece o objeto Type para o tipo nomeado. Isso é usado com mais frequência em estilos e modelos. Para obter detalhes, consulte:Marcação de Extensão x:Type.

x:Static produz valores estáticos de entidades de código de valor-tipo que não são diretamente o tipo de valor de uma propriedade, mas podem ser avaliados para esse tipo. Para obter detalhes, consulte:Extensão de Marcação x:Static.

x:Null especifica null como um valor para uma propriedade XAML. Para obter detalhes, consulte:Extensão de linguagem de marcação x:NULL.

x:Array fornece suporte para a criação de matrizes gerais na sintaxe XAML, para casos em que o suporte da coleção fornecido por elementos base e modelos de controle não é usado deliberadamente. Para obter detalhes, consulte:x:Array de marcação de extensão.

Mais sobre Sintaxe de Extensão de Marcação

*Classes de Extensão

O comportamento de cada extensão de marcação é identificado para um processador de XAML através de uma classe *de Extensão que é derivado de MarkupExtension , e fornece uma implementação do método ProvideValue. Esse método em cada extensão define que objeto é retornado após a extensão de marcação ser avaliada. O objeto retornado é normalmente instanciado ou definido utilizando os vários tokens de sequência de caracteres passados para a extensão de marcação.

Por exemplo, a classe StaticResourceExtension fornece a implementação de superfície do recurso real de pesquisa para que sua implementação de ProvideValue retorne o objeto que é solicitado, com a entrada dessa implementação determinada sendo uma sequência de caracteres que é usada para pesquisar o recurso pelo seu x:Key. Muitos desses detalhes de implementação são sem-importância se você estiver usando uma extensão de marcação existente.

Interpretação de Classe de Extensão de tokens de String Seguintes

Os tokens de sequência de caracteres seguindo o identificador de extensão de marcação e ainda dentro de chaves são interpretadas por um processador XAML de uma das maneiras a seguir:

  • Uma vírgula sempre representa o separador ou delimitador de tokens individuais. Portanto uma vírgula literal não pode ser passada para uma extensão de marcação.

  • Se os símbolos individuais separados não contém qualquer sinais de igual, cada símbolo é tratado como um argumento de construtor. Cada parâmetro de construtor deve ser dado como o tipo esperado por essa assinatura e na ordem correta esperada por essa assinatura.

    ObservaçãoObservação:

    A XAML processador deve chamar o construtor coincide com a contagem de argumento do número de pares. Por esse motivo, se você estiver implementando uma extensão de marcação personalizada, não forneça vários parâmetros com a mesma contagem de argumentos; não está definido o comportamento para o que acontece se existir mais de um construtor de extensão de marcação com a mesma contagem de parâmetro.

  • Se os tokens separados individualmente contém sinais de igual, então um processador XAML primeiro chama o construtor padrão para a extensão de marcação. Em seguida, cada par de nome=valor é interpretado como um nome de propriedade que existe na extensão de marcação e um valor para atribuir a essa propriedade.

  • Se houver um resultado paralelo entre o comportamento do construtor e o comportamento da configuração de propriedades em uma extensão de marcação, não importa qual comportamento você usar. O uso mais comum é o de usar os pares propriedade=valor para extensões de marcação que tem mais de uma propriedade configurável, se apenas porque torna a sua marcação mais intencional e é menos provável de você acidentalmente transpor parâmetros de construtor (quando você especifica a pares propriedade=valor, essas propriedades podem estar em qualquer ordem). Além disso, não haverá garantia que uma extensão de marcação forneça um parâmetro de construtor que define cada uma de suas propriedades configuráveis. Por exemplo, Binding é uma extensão de marcação, com muitas propriedades que são configuráveis através da extensão na propriedade = valor de formulário, mas Binding só oferece suporte a dois construtores: um construtor padrão e que define um caminho inicial.

Representando Chaves literal em uma Sequência de Escape

Tratamento de atributo em um processador de XAML usa as chaves como indicadores de uma extensão de marcação. Também é possível produzir um valor de atributo de caracteres chave literal se necessário, digitando uma sequência de escape usando um par de chave vazia seguido da chave literal. Consulte Sequência de escape {} / Extensão de linguagem de marcação.

Sintaxe de Extensão Aninhada

O aninhamento de várias extensões a marcação é suportado, e cada extensão de marcação será avaliada em primeiro lugar por profundidade, por exemplo:

<Setter Property="Background"

Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" />

Mais sobre Extensões de Marcação e Sintaxe de Propriedade de Elemento.

Quando usado como um elemento de objeto que preenche um valor de propriedade de elemento, uma classe de extensão de marcação é visualmente indistinguível de um elemento comum que pode ser usado no XAML. A diferença prática entre um elemento comum e uma extensão de marcação nessa circunstância é que a extensão de marcação é avaliada como um valor tipado ou diferida como uma expressão, e, portanto, os mecanismos para qualquer tipo de erros de valores de propriedade possíveis serão diferentes, semelhante a como uma propriedade de vinculado tardio é tratada em outros modelos de programação. Um elemento comum será avaliado pelo tipo versus a propriedade que ele está definindo imediatamente na compilação.

A maioria das extensões de marcação, quando usadas na sintaxe de elemento de objeto para preencher um elemento de propriedade, não terá o conteúdo ou qualquer outra sintaxe de elemento de propriedade dentro, e, portanto, você poderia fechar a marca do elemento de objeto e fornecer nenhum elemento filho. Sempre que qualquer elemento de objeto é encontrado por um processador de XAML, o construtor para essa classe é chamado para instanciar o objeto criado a partir do elemento analisado. Uma classe de extensão de marcação não é diferente; portanto, se você desejar que sua extensão de marcação seja utilizável na sintaxe de elemento de objeto, você deverá fornecer um construtor padrão. Algumas extensões de marcação existentes tem pelo menos um valor de propriedade necessário que deve ser especificado para inicialização efetiva e em caso afirmativo, que o valor da propriedade normalmente é dado como um atributo de propriedade no elemento do objeto. Nas páginas de referência Namespace XAML (x:) Recursos da linguagem e Extensões XAML do Namespace WPF , extensões de marcação que têm propriedades necessárias (e os nomes das propriedades necessárias) vão ser observadas. Páginas de referência também vão observar se a sintaxe de elemento de objeto ou sintaxe de atributo é desabilitada para extensões de marcação específicas. Uma ocorrência notável é x:Array de marcação de extensão, que não oferece suporte a sintaxe de atributo porque o conteúdo dessa matriz deve ser especificado. O conteúdo da matriz é tratado como objetos gerais, portanto, nenhum conversor de tipos padrão para o atributo é viável. Além disso, x:Array de marcação de extensão requer um parâmetro Type.

Consulte também

Conceitos

XAML Overview

Referência

Extensão de marcação StaticResource

Ligação de marcação de extensão

Extensão de marcação DynamicResource

Marcação de Extensão x:Type

Outros recursos

Namespace XAML (x:) Recursos da linguagem

Extensões XAML do Namespace WPF