Compartilhar via


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

Este tópico introduz o conceito de extensões de marcação de XAML, incluindo suas regras de sintaxe, objetivo e o modelo de objeto de classe que dá suporte a eles. As extensões de marcação são um recurso geral da linguagem XAML e da.NET implementação dos serviços XAML. Especificamente, este tópico detalha as extensões de marcação para uso em WPF XAML.

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

  • XAML Processors and Markup Extensions
  • Basic Markup Extension Syntax
  • XAML-Defined Markup Extensions
  • WPF-Specific Markup Extensions
  • *Extension Classes
  • Seqüências de escape e extensões de marcação
  • O aninhamento de extensões de marcação no uso do XAML
  • As extensões de marcação e a sintaxe de elemento de propriedade
  • Tópicos relacionados

XAML Processors and Markup Extensions

Em geral, um analisador XAML ou pode interpretar o valor do atributo como uma seqüência literal que pode ser convertida em um primitivo ou convertê-lo a um objeto por alguns meios. Um desses meios está fazendo referência a um conversor de tipo; Isto está documentado no tópico TypeConverters and XAML. No entanto, existem cenários onde um comportamento diferente é necessário. Por exemplo, um processador XAML pode ser instruído que um valor de um atributo não deve resultar em um novo objeto no gráfico de objeto. Em vez disso, o atributo deve resultar em um gráfico de objeto que faz uma referência a um objeto já construído em outra parte do gráfico ou um objeto estático. Outro cenário é que um processador XAML pode ser instruído a usar uma sintaxe que fornece os argumentos de não-padrão para o construtor de um objeto. Esses são os tipos de situações onde uma extensão de marcação pode fornecer a solução.

Basic Markup Extension Syntax

A markup extension can be implemented to provide values for properties in an attribute usage, properties in a property element usage, or both.

Quando usado para fornecer um valor de atributo, a sintaxe que distingue uma seqüência de extensão de marcação para um processador XAML é a presença de abertura e fechamento de chaves ({e}). The type of markup extension is then identified by the string token immediately following the opening curly brace.

Quando usado na sintaxe de elemento de propriedade, uma extensão de marcação é visualmente o mesmo que qualquer outro elemento usado para fornecer um valor de elemento de propriedade: uma declaração de elemento XAML que faz referência à classe de extensão de marcação, como um elemento, entre colchetes angulares (<>).

XAML-Defined Markup Extensions

Várias extensões de marcação existem que não são específicas para a implementação do WPF XAML, mas são, em vez disso, implementações de intrínsecos ou recursos de XAML como uma linguagem. Essas extensões de marcação são implementados no assembly System.Xaml como parte do geral.Os serviços de XAML do NET Framework e estão dentro do namespace XAML linguagem XAML. Em termos de uso comum de marcação, essas extensões de marcação são normalmente identificáveis pelo x: prefixo em uso. O MarkupExtension (também definida em System.Xaml) de classe base fornece o padrão de todas as extensões de marcação devem usar para ter suporte em leitores XAML e gravadores XAML, inclusive em WPF XAML.

  • x:Type supplies the Type object for the named type. Esse recurso é usado com mais freqüência em estilos e modelos. For details, see Marcação de Extensão x:Type.

  • x:Staticproduz valores estáticos. Os valores provenientes de entidades de código do tipo de valor que não são diretamente o tipo de valor da propriedade de destino, mas podem ser avaliados como tipo. For details, see Extensão de Marcação x:Static.

  • x:NullEspecifica null como um valor para uma propriedade e pode ser usado para atributos ou valores de elemento de propriedade. For details, see Extensão de linguagem de marcação x:NULL.

  • x:ArrayFornece suporte para a criação de matrizes gerais na sintaxe XAML, casos em que o suporte a coleção fornecidos pelos elementos de base do WPF e modelos de controle deliberadamente, não é usado. For details, see x:Array de marcação de extensão.

Observação

O x: prefixo é usado para o mapeamento de namespace XAML típico de intrínsecos de linguagem XAML, no elemento raiz de um arquivo XAML ou produção.Por exemplo, o Visual Studio modelos para aplicativos WPF iniciar um arquivo XAML usando essa x: de mapeamento.Você pode escolher um símbolo de prefixo diferente em seu próprio mapeamento de namespace XAML, mas esta documentação assumirá o padrão x: relacionados de mapeamento como um meio de identificar essas entidades que não são parte do namespace XAML para o idioma XAML, em oposição ao namespace padrão do WPF ou outros namespaces XAML definida para uma estrutura específica.

WPF-Specific Markup Extensions

As extensões de marcação mais comuns usadas em programação WPF são aqueles que oferecem suporte a referências de recurso (StaticResource e DynamicResource) e aqueles que suportam a vinculação de dados (Binding).

  • StaticResourceFornece um valor para uma propriedade, substituindo o valor de um recurso já definido. A avaliação deStaticResource , por fim, é feita no tempo de carregamento do XAML e não tem acesso para o gráfico do objeto em tempo de execução. Para obter detalhes, consulte Extensão de marcação StaticResource.

  • DynamicResourceFornece um valor para uma propriedade adiando esse valor a ser uma referência de tempo de execução para um recurso. Uma referência de recurso dinâmico força uma nova pesquisa cada vez que um recurso é acessado e tem acesso para o gráfico do objeto em tempo de execução. Para obter esse acesso, DynamicResource conceito é suportado pelas propriedades de dependência no sistema de propriedade do WPF e avaliar expressões. Portanto, você só pode usar DynamicResource para um destino de propriedade de dependência. For details, see Extensão de marcação DynamicResource.

  • BindingFornece que um dados ligados valor para uma propriedade, utilizando o contexto de dados que se aplica ao objeto pai em tempo de execução. This markup extension is relatively complex, because it enables a substantial inline syntax for specifying a data binding. For details, see Ligação de marcação de extensão.

  • RelativeSourceFornece informações de origem para um Binding que pode navegar vários relacionamentos possíveis na árvore do objeto de tempo de execução. Isso fornece a fonte especializadas para ligações que forem criadas modelos multiuso ou criadas em código sem um conhecimento completo da árvore ao redor do objeto. For details, see MarkupExtension do RelativeSource.

  • TemplateBinding enables a control template to use values for templated properties that come from object-model-defined properties of the class that will use the template. Em outras palavras, a propriedade dentro da definição de modelo pode acessar um contexto que existe somente uma vez que o modelo é aplicado. For details, see Extensão de linguagem de marcação TemplateBinding. Para obter mais informações sobre o uso prático do TemplateBinding, consulte de estilo com amostra de ControlTemplates.

  • ColorConvertedBitmapoferece suporte a um cenário relativamente avançado de tratamento de imagens. For details, see Extensão da Marcação ColorConvertedBitmap.

  • ComponentResourceKeye ThemeDictionary suporte a aspectos de pesquisa de recursos, especialmente para os recursos e os temas que vêm com controles personalizados. Para obter mais informações, consulte Extensão de Marcação de Marcação, ThemeDictionary Markup Extension, ou Visão geral sobre criação de controles.

*Extension Classes

Para o idioma XAML geral e as extensões de marcação específica do WPF, o comportamento de cada extensão de marcação é identificado para um processador XAML por meio de um *Extension classe que deriva de MarkupExtensione fornece uma implementação da ProvideValue método. Este método em cada extensão fornece o objeto que é retornado quando a extensão de marcação é avaliada. O objeto retornado normalmente é avaliado com base em vários tokens de seqüência de caracteres que são passados para a extensão de marcação.

For example, the StaticResourceExtension class provides the surface implementation of actual resource lookup so that its ProvideValue implementation returns the object that is requested, with the input of that particular implementation being a string that is used to look up the resource by its x:Key. Much of this implementation detail is unimportant if you are using an existing markup extension.

Algumas extensões de marcação não usam argumentos de token de seqüência de caracteres. Isso é porque elas retornam um valor estático ou consistente ou porque o contexto para o qual o valor deve ser retornado está disponível por meio de um dos serviços passados para o serviceProvider parâmetro.

O *Extension padrão de nomenclatura é para sua conveniência e consistência. Não é necessário para que um processador XAML identificar a classe como oferecer suporte a uma extensão de marcação. Contanto que sua base de código inclui System.Xaml e usa.Implementações de serviços do NET Framework XAML, tudo isso é necessário ser reconhecido como uma extensão de marcação XAML é derivar de MarkupExtension e dar suporte a uma sintaxe de construção. WPF define classes de marcação habilitando a extensão que não seguem o *Extension nomenclatura padrão, por exemplo Binding. Normalmente, o motivo para isso é que a classe oferece suporte a cenários além do suporte de extensão de marcação puro. No caso de Binding, classe oferece suporte ao acesso de tempo de execução para os métodos e propriedades do objeto para cenários que não têm nada a ver com o XAML.

Interpretação de classe de extensão do texto de inicialização

Os tokens de seqüência de caracteres após a extensão de marcação de nome e ainda dentro das chaves são interpretados por um processador XAML em uma das seguintes maneiras:

  • A comma always represents the separator or delimiter of individual tokens.

  • If the individual separated tokens do not contain any equals signs, each token is treated as a constructor argument. Each constructor parameter must be given as the type expected by that signature, and in the proper order expected by that signature.

    Observação

    Um processador XAML deve chamar o construtor que corresponda a contagem do número de pares de argumentos.Por esse motivo, se você estiver implementando uma extensão de marcação personalizada, não fornecem vários parâmetros com a mesma contagem de argumentos.O comportamento para o comportamento de um processador XAML exista mais de um caminho de construtor de extensão de marcação com a mesma contagem de parâmetro não está definido, mas você deve prever que um processador XAML é permitido para lançar uma exceção em uso, se essa situação existe nas definições de tipo de extensão de marcação.

  • Se o indivíduo separados tokens conter sinais de igual, um processador XAML primeiro chama o construtor padrão para a extensão de marcação. Then, each name=value pair is interpreted as a property name that exists on the markup extension, and a value to assign to that property.

  • If there is a parallel result between the constructor behavior and the property setting behavior in a markup extension, it does not matter which behavior you use. Ele é o uso mais comum para usar o propriedade=valor pares de extensões de marcação que têm mais de uma propriedade configurável, se apenas porque faz sua marcação mais intencional e você terá menos probabilidade de acidentalmente Transpor parâmetros do construtor. (Quando você especificar a propriedade = pares de valor dessas propriedades podem estar em qualquer ordem.) Also, there is no guarantee that a markup extension supplies a constructor parameter that sets every one of its settable properties. Por exemplo, Binding é uma extensão de marcação, com muitas propriedades que são configuráveis através da extensão no propriedade=valor o formulário, mas Binding somente suporta dois construtores: um construtor padrão e que define um caminho inicial.

  • Uma vírgula literal não pode ser passada para uma extensão de marcação sem escape.

Seqüências de escape e extensões de marcação

Atributo manipulação em um processador XAML usa chaves como indicadores de uma seqüência de extensão de marcação. It is also possible to produce a literal curly brace character attribute value if necessary, by entering an escape sequence using an empty curly brace pair followed by the literal curly brace. See Sequência de escape {} / Extensão de linguagem de marcação.

O aninhamento de extensões de marcação no uso do XAML

O aninhamento de várias extensões de marcação é suportado, e cada extensão de marcação será avaliado mais profundo primeiro. Por exemplo, considere o seguinte uso:

  <Setter Property="Background"
    Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" />

Nessa utilização, o x:Static instrução é avaliada primeiro e retorna uma seqüência de caracteres. Que a seqüência de caracteres, em seguida, é usada como argumento para DynamicResource.

As extensões de marcação e a sintaxe de elemento de propriedade

Quando usado como um elemento de objeto que preenche um valor de elemento de propriedade, uma classe de extensão de marcação é visualmente indistinguíveis de um elemento de objeto do tipo de reserva típico que pode ser usado em XAML. A diferença prática entre um elemento de objeto típico e uma extensão de marcação é que a extensão de marcação é avaliada como um valor digitado ou adiada como uma expressão. Portanto, os mecanismos para todos os erros possíveis tipos de valores de propriedade para a extensão de marcação serão diferentes, semelhante a como uma propriedade de ligação tardia é tratada em outros modelos de programação. Um elemento de objeto comum será avaliado para correspondência de tipo com a propriedade de destino está sendo quando o XAML é analisado.

A maioria das extensões de marcação, quando usado na sintaxe de elemento de objeto para preencher um elemento de propriedade, não teria a sintaxe de elemento de propriedade de conteúdo ou qualquer outra dentro. Assim, deseja fechar a marca de elemento de objeto e não fornecem elementos de nenhum filho. Sempre que qualquer elemento de objeto for encontrado por um processador XAML, o construtor para essa classe é chamado, que instancia o objeto criado a partir do elemento analisado. Uma classe de extensão de marcação não é diferente: Se desejar que sua extensão de marcação para ser usado na sintaxe de elemento de objeto, você deve fornecer um construtor padrão. Algumas extensões de marcação existente tem pelo menos um valor de propriedade necessária deve ser especificado para inicialização efetiva. Em caso afirmativo, valor da propriedade normalmente é fornecido como um atributo de propriedade no elemento de objeto. In the Namespace XAML (x:) Recursos da linguagem and Extensões do WPF XAML reference pages, markup extensions that have required properties (and the names of required properties) will be noted. Reference pages will also note if either object element syntax or attribute syntax is disallowed for particular markup extensions. Um caso 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 na marcação como conteúdo. O conteúdo da matriz é tratado como objetos gerais, portanto nenhum Conversor de tipo padrão para o atributo é viável. Also, x:Array de marcação de extensão requires a type parameter.

Consulte também

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

Conceitos

Visão geral do XAML (WPF)

Outros recursos

Namespace XAML (x:) Recursos da linguagem

Extensões do WPF XAML