Sintaxe XAML em detalhes
Este tópico define os termos que são usados para descrever os elementos de sintaxe XAML. Esses termos são usados com freqüência no decorrer desta documentação, tanto para a documentação do WPF especificamente e outras estruturas que usam XAML ou os conceitos básicos do XAML habilitados pelo suporte de linguagem XAML no nível de System.Xaml. Este tópico expande a terminologia básica introduzida no tópico Visão geral do XAML (WPF).
Este tópico contém as seguintes seções.
- A especificação da linguagem XAML
- XAML and CLR
- Object Element Syntax
- Propriedades dos elementos do objeto
- Sintaxe de atributo (Propriedades)
- Property Element Syntax
- Sintaxe de coleção
- XAML Content Properties
- Propriedades de conteúdo e a sintaxe de coleção combinada
- XAML Namespaces
- Markup Extensions
- Attached Properties
- Attached Events
- Anatomia de um elemento raiz do XAML
- Optional and Nonrecommended XAML Usages
- Tópicos relacionados
A especificação da linguagem XAML
A terminologia de sintaxe XAML definida aqui é também definida ou referenciada dentro da especificação da linguagem XAML. XAML é uma linguagem com base em XML e segue ou expande a regras estruturais do XML. Parte da terminologia compartilhados a partir ou baseia-se a terminologia comumente usada para descrever a linguagem XML ou o modelo de objeto de documento XML.
Para obter mais informações sobre a especificação da linguagem XAML, descarregue o [MS-xaml] do Centro de Download da Microsoft.
XAML and CLR
O XAML é uma linguagem de marcação. O common language runtime (CLR), como seu nome, permite a execução de tempo de execução. XAML não é por si só, um dos idiomas comuns que é consumida diretamente pelo tempo de execução do CLR. Em vez disso, você pode pensar XAML como seu próprio sistema de tipo de suporte. O sistema de análise de XAML específico que é usado pelo WPF se baseia no CLR e o sistema de tipos CLR. Tipos XAML são mapeados para tipos CLR para instanciar uma representação de tempo de execução quando o XAML para WPF é analisado. Por esse motivo, o restante da discussão de sintaxe neste documento incluirá referências para o sistema de tipos CLR, mesmo que não as discussões sintaxe equivalente a especificação da linguagem XAML. (Por nível de especificação de linguagem XAML tipos XAML poderiam ser mapeados para qualquer outro tipo sistema, que não precisa ser o CLR, mas isso exigiria a criação e o uso de um analisador de XAML diferente.)
Membros de tipos e herança de classe
Propriedades e eventos como eles aparecem como MEMBROS de XAML de um WPF tipo geralmente são herdadas de tipos base. Por exemplo, considere este exemplo: <Button Background="Blue" .../>. O Background propriedade não é uma propriedade declarada imediatamente sobre o Button classe, se você olhar a definição de classe, resultados de reflexão ou documentação. Instead, Background is inherited from the base Control class.
O comportamento da herança de classe de WPF elementos XAML é um desvio significativo de uma interpretação aplicado o esquema de marcação XML. Herança de classe pode se tornar complexa, especialmente quando classes base intermediárias são abstratos ou interfaces envolvidas. Esse é um motivo que o conjunto de elementos XAML e seus atributos permitidos é difícil representar precisamente e completamente usando os tipos de esquema é normalmente usado para XML de programação, como o formato DTD ou XSD. Outro motivo é que extensibilidade e recursos de mapeamento de tipo da própria linguagem XAML impedem a integridade de qualquer representação fixa dos tipos permitidos e membros.
Object Element Syntax
A sintaxe de elemento de objeto é a sintaxe de marcação XAML que instancia uma classe CLR ou estrutura, declarando um elemento XML. Essa sintaxe é semelhante a sintaxe de elemento de outras linguagens de marcação, como HTML. Object element syntax begins with a left angle bracket (<), followed immediately by the type name of the class or structure being instantiated. Zero or more spaces can follow the type name, and zero or more attributes may also be declared on the object element, with one or more spaces separating each attribute name="value" pair. Finally, one of the following must be true:
The element and tag must be closed by a forward slash (/) followed immediately by a right angle bracket (>).
The opening tag must be completed by a right angle bracket (>). Other object elements, property elements, or inner text, can follow the opening tag. Exatamente o conteúdo que possam estar contido aqui normalmente é restrito pelo modelo de objeto do elemento. The equivalent closing tag for the object element must also exist, in proper nesting and balance with other opening and closing tag pairs.
Conforme implementado do XAML.NET tem um conjunto de regras que mapeiam os elementos object em tipos de atributos em namespaces XAML para CLR namespaces plus assembly ou eventos e propriedades. Para WPF e o.NET Framework, os elementos do objeto XAML mapeiam para Microsoft .NET tipos como definidos em assemblies referenciados, e os atributos mapeiam para os membros desses tipos. Quando você referencia um tipo CLR em XAML, você terá acesso aos membros desse tipo também herdados.
For example, the following example is object element syntax that instantiates a new instance of the Button class, and also specifies a Name attribute and a value for that attribute:
<Button Name="CheckoutButton"/>
O exemplo a seguir é a sintaxe de elemento de objeto que também inclui a sintaxe da propriedade content de XAML. O texto interno contido será usado para definir o TextBox propriedade de conteúdo XAML, Text.
<TextBox>This is a Text Box</TextBox>
Content Models
Uma classe pode oferecer suporte a um uso como um elemento de objeto XAML em termos de sintaxe, mas esse elemento só funcionará corretamente em um aplicativo ou página quando ela é colocada em uma posição esperada de uma árvore de elemento ou o modelo geral do conteúdo. For example, a MenuItem should typically only be placed as a child of a MenuBase derived class such as Menu. Conteúdo de modelos para elementos específicos são documentados como parte de comentários nas páginas de classe para controles e outros WPF classes que podem ser usados como elementos do XAML.
Propriedades dos elementos do objeto
Propriedades em XAML são definidas por uma variedade de sintaxes possíveis. Qual sintaxe pode ser usado para uma determinada propriedade irão variar, com base nas características de sistema de tipo subjacente da propriedade que você está configurando.
Definindo os valores das propriedades, você adiciona recursos ou características para objetos como elas existem no gráfico de objeto de tempo de execução. O estado inicial do objeto criado a partir de um elemento de objeto baseia-se o comportamento do construtor padrão. Typically, your application will use something other than a completely default instance of any given object.
Sintaxe de atributo (Propriedades)
A sintaxe de atributo é a sintaxe de marcação XAML que define um valor para uma propriedade, declarando um atributo em um elemento de objeto existente. O nome de atributo deve corresponder ao nome do membro CLR da propriedade da classe que faz o elemento de objeto relevante. The attribute name is followed by an assignment operator (=). O valor do atributo deve ser uma seqüência de caracteres entre aspas.
Observação
Você pode usar aspas alternadas para colocar uma marca de aspas literal dentro de um atributo.Por exemplo, você pode usar aspas simples como um meio para declarar uma seqüência de caracteres que contém um caractere de aspas duplas dentro dele.Se você usar aspas simples ou duplas, você deve usar um par correspondente para abrir e fechar a seqüência de caracteres do valor de atributo.Há também seqüências de escape ou outras técnicas disponíveis para trabalhar em torno de restrições de caracteres impostas por qualquer determinada sintaxe XAML.See Entidades e XAML de caractere XML.
Para ser definido por meio da sintaxe de atributo, uma propriedade deve ser pública e deve ser gravável. O valor da propriedade do sistema de tipo de backup deve ser um tipo de valor ou fazendo deve ser um tipo de referência que pode ser instanciado ou referenciado por um processador XAML ao acessar o relevantes dos tipo.
Para eventos do WPF XAML, o evento que é referenciado como o nome de atributo deve ser público e tem um delegado público.
The property or event must be a member of the class or structure that is instantiated by the containing object element.
Processing of Attribute Values
O valor de seqüência contido a abertura e aspas de fechamento é processado por um processador XAML. Propriedades, o comportamento de processamento padrão é determinado pelo tipo da propriedade CLR subjacente.
The attribute value is filled by one of the following, using this processing order:
Se o processador XAML encontrar uma chave ou um elemento de objeto que deriva do MarkupExtension, a extensão de marcação referenciado é avaliada primeiro em vez de processar o valor como uma seqüência, e o objeto retornado pela extensão de marcação é usado como o valor. Em muitos casos, o objeto retornado por uma extensão de marcação será uma referência a um objeto existente ou uma expressão que adia a avaliação até o tempo de execução e não é um objeto instâncias recém-criadas.
Se a propriedade for declarada com um atribuída TypeConverter, ou o tipo de valor dessa propriedade é declarado com um atribuída TypeConverter, o valor de seqüência de caracteres do atributo é enviado para o conversor de tipo como uma entrada de conversão, e o conversor irá retornar uma nova instância do objeto.
If there is no TypeConverter, a direct conversion to the property type is attempted. Esse nível final é uma conversão direta com o valor do analisador nativa entre tipos primitivos de linguagem XAML ou uma verificação dos nomes de constantes nomeadas em uma enumeração (o analisador, então, acessa os valores correspondentes).
Enumeration Attribute Values
Enumerações no XAML são processadas intrinsecamente pelos analisadores XAML e os membros de uma enumeração devem ser especificados, especificando o nome de seqüência de caracteres de uma das constantes nomeadas da enumeração.
For nonflag enumeration values, the native behavior is to process the string of an attribute value and resolve it to one of the enumeration values. You do not specify the enumeration in the format Enumeration.Value, as you do in code. Instead, you specify only Value, and Enumeration is inferred by the type of the property you are setting. If you specify an attribute in the Enumeration.Value form, it will not resolve correctly.
For flagwise enumerations, the behavior is based on the Enum.Parse method. You can specify multiple values for a flagwise enumeration by separating each value with a comma. However, you cannot combine enumeration values that are not flagwise. For instance, you cannot use the comma syntax to attempt to create a Trigger that acts on multiple conditions of a nonflag enumeration:
<!--This will not compile, because Visibility is not a flagwise enumeration.-->
...
<Trigger Property="Visibility" Value="Collapsed,Hidden">
<Setter ... />
</Trigger>
...
Enumerações flagwise que oferecem suporte a atributos que são configuráveis no XAML são raras no WPF. However, one such enumeration is StyleSimulations. Você poderia, por exemplo, usar a sintaxe de atributo de flagwise delimitada por ponto-e-vírgula para modificar o exemplo fornecido nos comentários para o Glyphs classe; StyleSimulations = "BoldSimulation"pode se tornar StyleSimulations = "BoldSimulation,ItalicSimulation". KeyBinding.Modifiersé outra propriedade onde mais de um valor de enumeração pode ser especificado. No entanto, essa propriedade acaso, é um caso especial, porque o ModifierKeys enumeração oferece suporte a seu próprio conversor de tipo. O conversor de tipos para modificadores usa um sinal de adição (+) como um delimitador, em vez de uma vírgula (,). Essa conversão suporta a sintaxe mais tradicional para representar as combinações de teclas na programação do Microsoft Windows, como, por exemplo, "ctrl + Alt".
Referências de nome de membro de eventos e propriedades
Ao especificar um atributo, você pode referenciar qualquer propriedade ou evento que existe como um membro do tipo CLR, que criar uma instância do elemento de objeto recipiente.
Or, you can reference an attached property or attached event, independent of the containing object element. (Propriedades anexadas são discutidas em uma próxima seção).
Você também pode nomear qualquer evento de qualquer objeto que pode ser acessada por meio do namespace padrão usando um typeName.evento nome qualificado parcialmente; Essa sintaxe suporta anexar manipuladores para roteados eventos onde o manipulador destina-se para manipular eventos de roteamento de elementos filho, mas o elemento pai também não têm esse evento em sua tabela de membros. This syntax resembles an attached event syntax, but the event here is not a true attached event. Instead, you are referencing an event with a qualified name. For more information, see Visão geral sobre eventos roteados.
Alguns cenários, os nomes de propriedade às vezes são fornecidos como o valor de um atributo, em vez do nome de atributo. Esse nome de propriedade também pode incluir os qualificadores, como, por exemplo, a propriedade especificada no formulário ownerType.dependencyPropertyName. Essa situação é comum ao escrever estilos ou modelos no XAML. As regras de processamento para nomes de propriedade fornecidos como um valor de atributo são diferentes e são regidas pelo tipo da propriedade sendo definida ou os comportamentos dos subsistemas WPF específicos. For details, see Styling and Templating.
Another usage for property names is when an attribute value describes a property-property relationship. Esse recurso é usado para vinculação de dados e destinos de storyboard e é habilitado pela PropertyPath classe e seu tipo de conversor. For a more complete description of the lookup semantics, see Sintaxe de um PropertyPath XAML.
Property Element Syntax
Sintaxe de elemento de propriedade é uma sintaxe que difere um pouco do que as regras de sintaxe XML básicas para elementos. Em XML, o valor de um atributo é uma seqüência de caracteres de facto, com a variação só é possível, sendo que formato de codificação de seqüência de caracteres que está sendo usado. No XAML, você pode atribuir a outros elementos como o valor de uma propriedade do objeto. This capability is enabled by the property element syntax. Em vez da propriedade sendo especificada como um atributo dentro da marca de elemento, a propriedade for especificada, usando um elemento de abertura marca em elementTypeName.propertyName o formulário, o valor da propriedade é especificado dentro e, em seguida, o elemento de propriedade é fechado.
Specifically, the syntax begins with a left angle bracket (<), followed immediately by the type name of the class or structure that the property element syntax is contained within. Isso é seguido imediatamente por um único ponto (.), em seguida, pelo nome de uma propriedade, em seguida, um colchete angular direito (>). Como com a sintaxe de atributo, a propriedade deve existir dentro de declarado membros públicos do tipo especificado. The value to be assigned to the property is contained within the property element. Typically, the value is given as one or more object elements, because specifying objects as values is the scenario that property element syntax is intended to address. Finally, an equivalent closing tag specifying the same elementTypeName.propertyName combination must be provided, in proper nesting and balance with other element tags.
For example, the following is property element syntax for the ContextMenu property of a Button.
<Button>
<Button.ContextMenu>
<ContextMenu>
<MenuItem Header="1">First item</MenuItem>
<MenuItem Header="2">Second item</MenuItem>
</ContextMenu>
</Button.ContextMenu>
Right-click me!</Button>
O valor dentro de um elemento de propriedade pode também ser fornecido como texto interno, em casos onde o tipo de propriedade especificado é um tipo de valor primitivo, tal como String, ou uma enumeração onde for especificado um nome. Esses dois usos são um pouco incomuns, porque cada um desses casos também poderia usar uma sintaxe mais simples de atributo. Um cenário para o preenchimento de um elemento de propriedade com uma seqüência de caracteres é para propriedades que não são de propriedade de conteúdo de XAML, mas que ainda são usadas para a representação de texto da interface do usuário e os elementos de determinado espaço em branco como, por exemplo, alimentações de linha são necessários para aparecer no texto da interface do usuário. Attribute syntax cannot preserve linefeeds, but property element syntax can, so long as significant whitespace preservation is active (for details, see Processamento de Espaço em branco em XAML). Outro cenário é para que x: Uid diretiva podem ser aplicadas ao elemento de propriedade e, portanto, marcar o valor dentro como um valor que deve ser localizado na saída do WPF BAML ou por outras técnicas.
Um elemento de propriedade não é representado na árvore de lógica do WPF. Um elemento de propriedade é uma determinada sintaxe para definir uma propriedade e não é um elemento que possui uma instância ou um objeto fazendo a ele. (Para obter detalhes sobre o conceito de árvore lógica, consulte Árvores em WPF.)
For properties where both attribute and property element syntax are supported, the two syntaxes generally have the same result, although subtleties such as whitespace handling can vary slightly between syntaxes.
Sintaxe de coleção
A especificação XAML exige implementações de processador XAML para identificar onde o tipo de valor é uma coleção de propriedades. A implementação geral do processador XAML no.NET está baseado em código gerenciado e o CLR e identifica os tipos de coleção por meio de um dos seguintes:
Digite implementa IList.
Digite implementa IDictionary.
Tipo deriva de Array (para obter mais informações sobre matrizes em XAML, consulte x:Array de marcação de extensão.)
Se o tipo de uma propriedade é uma coleção, o tipo de coleção inferido não precisa ser especificado na marcação como um elemento de objeto. Em vez disso, os elementos que se destinam a se tornar os itens na coleção são especificados como um ou mais elementos filho do elemento de propriedade. Cada item tal é avaliada para um objeto durante o carregamento e adicionado à coleção, chamando o Add o método da coleção implícita. Por exemplo, o Triggers propriedade de Style leva o tipo de coleção especializados TriggerCollection, que implementa IList. Não é necessário instanciar um TriggerCollection o elemento object na marcação. Instead, you specify one or more Trigger items as elements within the Style.Triggers property element, where Trigger (or a derived class) is the type expected as the item type for the strongly typed and implicit TriggerCollection.
<Style x:Key="SpecialButton" TargetType="{x:Type Button}">
<Style.Triggers>
<Trigger Property="Button.IsMouseOver" Value="true">
<Setter Property = "Background" Value="Red"/>
</Trigger>
<Trigger Property="Button.IsPressed" Value="true">
<Setter Property = "Foreground" Value="Green"/>
</Trigger>
</Style.Triggers>
</Style>
Uma propriedade pode ser um tipo de coleção e a propriedade content de XAML para esse tipo e derivado de tipos, o que é abordado na próxima seção deste tópico.
Um elemento da coleção implícito cria um membro na representação de árvore lógica, mesmo que ela não aparece na marcação como um elemento. Geralmente o construtor do tipo pai realiza a instanciação da coleção que é uma das suas propriedades e a coleção inicialmente vazia se torna parte da árvore de objetos.
Observação
As interfaces de lista e o dicionário genéricas (IList<T> e IDictionary<TKey, TValue>) não há suporte para detecção de coleção.However, you can use the List<T> class as a base class, because it implements IList directly, or Dictionary<TKey, TValue> as a base class, because it implements IDictionary directly.
No.Referência de NET páginas para tipos de coleção, essa sintaxe com a omissão deliberada do elemento de objeto para uma coleção ocasionalmente nas seções de sintaxe XAML conforme mostrado sintaxe implícita de coleção.
Com exceção do elemento raiz, cada objeto em um arquivo XAML que é aninhado como um elemento filho de outro elemento é realmente um elemento que é um ou ambos os casos a seguir: um membro de uma propriedade de coleção implícito de seu elemento pai ou de um elemento que especifica o valor da propriedade de conteúdo XAML para o elemento pai (XAML conteúdo de propriedades serão discutidas em uma próxima seção). In other words, the relationship of parent elements and child elements in a markup page is really a single object at the root, and every object element beneath the root is either a single instance that provides a property value of the parent, or one of the items within a collection that is also a collection-type property value of the parent. Esse conceito de raiz única é comum com o XML e é freqüentemente reforçado no comportamento de APIs que carregar o XAML, como Load.
O exemplo a seguir é uma sintaxe com o elemento de objeto para uma coleção (GradientStopCollection) especificado explicitamente.
<LinearGradientBrush>
<LinearGradientBrush.GradientStops>
<GradientStopCollection>
<GradientStop Offset="0.0" Color="Red" />
<GradientStop Offset="1.0" Color="Blue" />
</GradientStopCollection>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
Observe que nem sempre é possível declarar explicitamente a coleção. Por exemplo, a tentativa de declarar TriggerCollection explicitamente em mostrada anteriormente Triggers exemplo poderia falhar. Declarar explicitamente a coleção requer que a classe de coleção deve suportar um construtor padrão, e TriggerCollection não tem um construtor padrão.
XAML Content Properties
Sintaxe de conteúdo XAML é uma sintaxe que é ativada somente em classes que especificam o ContentPropertyAttribute como parte de sua declaração de classe. O ContentPropertyAttribute referencia o nome de propriedade é a propriedade de conteúdo para esse tipo de elemento (incluindo classes derivadas). Quando processado por um processador XAML, quaisquer elementos filho ou texto interno, encontram-se entre as marcas de abertura e fechamento do elemento de objeto será atribuído como o valor da propriedade de conteúdo XAML para esse objeto. Você tem permissão para especificar os elementos de propriedade explícita para a propriedade de conteúdo, mas esse uso não é geralmente mostrado nas seções de sintaxe XAML na.Referência de NET. A técnica detalhada explícita tem valor ocasional para fins de esclarecimento de marcação ou como uma questão de estilo de marcação, mas geralmente a intenção de uma propriedade de conteúdo é simplificar a marcação para que os elementos relacionados intuitivamente como pai-filho podem ser aninhados diretamente. Marcas de elemento de propriedade para outras propriedades de um elemento não forem designadas como "conteúdo" por uma definição de linguagem XAML estrita; eles são processados anteriormente na ordem de processamento do analisador de XAML e não são considerados como "conteúdo".
XAML Content Property Values Must Be Contiguous
O valor de uma propriedade de conteúdo XAML deve ser dada inteiramente antes ou após inteiramente a outros elementos de propriedade desse elemento de objeto. Isso é verdadeiro se o valor de uma propriedade de conteúdo XAML é especificado como uma seqüência de caracteres ou como um ou mais objetos. Por exemplo, a seguinte marcação não analisar:
<Button>I am a
<Button.Background>Blue</Button.Background>
blue button</Button>
Isso é ilegal, essencialmente, porque se essa sintaxe foram feita explícita usando a sintaxe de elemento de propriedade para a propriedade de conteúdo, em seguida, a propriedade content seria definida duas vezes:
<Button>
<Button.Content>I am a </Button.Content>
<Button.Background>Blue</Button.Background>
<Button.Content> blue button</Button.Content>
</Button>
A similarly illegal example is if the content property is a collection, and child elements are interspersed with property elements:
<StackPanel>
<Button>This example</Button>
<StackPanel.Resources>
<SolidColorBrush x:Key="BlueBrush" Color="Blue"/>
</StackPanel.Resources>
<Button>... is illegal XAML</Button>
</StackPanel>
Propriedades de conteúdo e a sintaxe de coleção combinada
Para aceitar mais de um elemento único objeto, como conteúdo, o tipo da propriedade content deve especificamente ser um tipo de coleção. Semelhante à sintaxe de elemento de propriedade para tipos de coleção, um processador XAML deve identificar tipos que são tipos de coleção. Se um elemento tem uma propriedade de conteúdo XAML e o tipo da propriedade de conteúdo XAML é uma coleção, o tipo de coleção implícita não precisa ser especificado na marcação como um elemento de objeto, e a propriedade content de XAML não precisa ser especificado como um elemento de propriedade. Therefore the apparent content model in the markup can now have more than one child element assigned as the content. A seguir está a sintaxe de conteúdo para um Panel derivado da classe. Todos os Panel classes derivadas estabelecer a propriedade content de XAML para ser Children, o que requer um valor do tipo UIElementCollection.
<Page
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
>
<StackPanel>
<Button>Button 1</Button>
<Button>Button 2</Button>
<Button>Button 3</Button>
</StackPanel>
</Page>
Note that neither the property element for Children nor the element for the UIElementCollection is required in the markup. Este é um recurso de design do XAML para que recursivamente continha elementos que definem um UI mais intuitivamente são representados como uma árvore de elementos aninhados com relações de elemento pai-filho imediato, sem marcas de elemento de propriedade intermediárias ou coleção de objetos. Na verdade, UIElementCollection não pode ser especificado explicitamente na marcação como um elemento de objeto, por design. Because its only intended use is as an implicit collection, UIElementCollection does not expose a public default constructor and thus cannot be instantiated as an object element.
Mixing Property Elements and Object Elements in an Object with a Content Property
A especificação XAML declara que um processador XAML pode impor que os elementos do objeto são usados para preencher a propriedade de conteúdo XAML dentro de um elemento de objeto devem ser contíguos e não devem ser misturados. Essa restrição contra a combinação de elementos de propriedade e o conteúdo é imposta pelo WPF processadores XAML.
You can have a child object element as the first immediate markup within an object element. Then you can introduce property elements. Or, you can specify one or more property elements, then content, then more property elements. Mas, depois de um elemento de propriedade segue o conteúdo, você não pode incluir qualquer conteúdo adicional, você só pode adicionar elementos de propriedade.
This content / property element order requirement does not apply to inner text used as content. However, it is still a good markup style to keep inner text contiguous, because significant whitespace will be difficult to detect visually in the markup if property elements are interspersed with inner text.
XAML Namespaces
Nenhum dos exemplos anteriores sintaxe especificado um namespace XAML diferente do namespace XAML padrão. Na típica WPF aplicativos, o padrão do namespace XAML é especificado para ser a WPF namespace. Você pode especificar espaços para nome XAML diferente do namespace XAML padrão e ainda usar uma sintaxe semelhante. Mas, em seguida, em qualquer lugar onde uma classe é nomeada, o que não é acessível dentro do namespace XAML padrão, esse nome de classe deve ser precedido com o prefixo do namespace XAML como mapeado para o namespace CLR correspondente. Por exemplo, <custom:Example/> sintaxe de elemento de objeto para criar uma instância da Example classe, onde o namespace CLR que contém a classe (e possivelmente as informações de assembly externo que contém os tipos de backup) anteriormente foi mapeado para o custom prefixo.
Para obter mais informações sobre namespaces XAML, consulte Namespaces XAML e o mapeamento de Namespace para WPF XAML.
Markup Extensions
XAML define uma entidade que permite que um escape de tratamento de processador XAML normal de valores de atributo de seqüência de caracteres ou elementos do objeto e adia o processamento de uma classe de apoio de programação de extensão de marcação. O caractere que identifica uma extensão de marcação para um processador XAML ao usar a sintaxe de atributo é a chave de abertura ({}), seguido de qualquer caractere diferente de uma chave de fechamento (}). The first string following the opening curly brace must reference the class that provides the particular extension behavior, where the reference may omit the substring "Extension" if that substring is part of the true class name. Thereafter, a single space may appear, and then each succeeding character is used as input by the extension implementation, up until the closing curly brace is encountered.
A.NET XAML implementação usa a MarkupExtension a classe abstrata como base para todas as extensões de marcação com suporte de WPF , bem como outras estruturas ou tecnologias. As extensões de marcação que WPF especificamente implementa freqüentemente se destinam a fornecer um meio para fazer referência a outros objetos existentes, ou fazer adiadas referências a objetos que serão avaliados no tempo de execução. Por exemplo, uma ligação de dados simples do WPF é feita especificando a {Binding} a extensão de marcação em lugar do valor que seria uma determinada propriedade take normalmente. Muitas das extensões de marcação do WPF permitem uma sintaxe de atributo para propriedades onde uma sintaxe de atributo não seria possível. Por exemplo, um Style objeto é um tipo relativamente complexo que contém uma série aninhada de objetos e propriedades. Estilos no WPF são normalmente definidos como um recurso em um ResourceDictionarye em seguida, referenciados por meio de uma das duas extensões de marcação do WPF que solicitam um recurso. A extensão de marcação adia a avaliação do valor da propriedade para uma pesquisa de recursos e permite fornecer o valor da Style propriedade, levando o tipo de Style, no atributo sintaxe como no exemplo a seguir:
<Button Style="{StaticResource MyStyle}">My button</Button>
Here, StaticResource identifies the StaticResourceExtension class providing the markup extension implementation. A próxima seqüência de caracteres MyStyle é usado como entrada para o não-padrão StaticResourceExtension construtor, onde o parâmetro como extraído da seqüência de caracteres de extensão declara o solicitada ResourceKey. MyStyleé esperado para ser o X:Key o valor de um Style definido como um recurso. The Extensão de marcação StaticResource usage requests that the resource be used to provide the Style property value through static resource lookup logic at load time.
For more information about markup extensions, see As extensões de marcação e o WPF XAML. Para obter uma referência de extensões de marcação e de outro XAML programação recursos habilitados em geral.NET a implementação de XAML, consulte Namespace XAML (x:) Recursos da linguagem. Para as extensões de marcação específica do WPF, consulte Extensões do WPF XAML.
Attached Properties
Propriedades anexadas são um conceito de programação introduzido no XAML, na qual propriedades podem ser de propriedade e definidas por um determinado tipo, mas definido como atributos ou elementos de propriedade em qualquer elemento. O cenário principal propriedades anexadas são destinadas é permitir que os elementos filho em uma estrutura de marcação informações de relatório para um elemento pai sem a necessidade de um modelo de objeto amplamente compartilhado entre todos os elementos. Conversely, attached properties can be used by parent elements to report information to child elements. For more information on the purpose of attached properties and how to create your own attached properties, see Attached Properties Overview.
Attached properties use a syntax that superficially resembles property element syntax, in that you also specify a typeName.propertyName combination. There are two important differences:
You can use the typeName.propertyName combination even when setting an attached property through attribute syntax. Attached properties are the only case where qualifying the property name is a requirement in an attribute syntax.
You can also use property element syntax for attached properties. However, for typical property element syntax, the typeName you specify is the object element that contains the property element. If you are referring to an attached property, then the typeName is the class that defines the attached property, not the containing object element.
Attached Events
Eventos anexados são outro conceito de programação introduzido no XAML, onde os eventos podem ser definidos por um tipo específico, mas manipuladores podem ser conectados em qualquer elemento de objeto. Na implementação de WOF, geralmente o tipo que define um evento anexado é um tipo estático que define um serviço e às vezes, esses eventos anexados são expostos por um alias de evento roteado em tipos que expõem o serviço. Handlers for attached events are specified through attribute syntax. Como com eventos anexados, a sintaxe de atributo é expandida para eventos anexados permitir que um typeName.eventName o uso, onde typeName é a classe que fornece Add e Remove acessadores de manipulador de eventos para a infra-estrutura de evento anexado, e eventName é o nome do evento.
Anatomia de um elemento raiz do XAML
A tabela a seguir mostra um típico elemento raiz XAML dividido, mostrando os atributos específicos de um elemento raiz:
<Page |
Opening object element of the root element |
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation" |
O padrão (WPF) namespace XAML |
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" |
Namespace XAML linguagem XAML |
x:Class="ExampleNamespace.ExampleCode" |
A declaração de classe parcial que se conecta a marcação para nenhum code-behind definido para a classe parcial |
> |
Final do elemento de objeto para a raiz. Objeto não é fechado ainda porque o elemento contém elementos filhos |
Optional and Nonrecommended XAML Usages
As seções a seguir descrevem os usos XAML que tecnicamente são suportadas por processadores XAML, mas que produzem verbosidade ou outros problemas estéticos que interferem com os arquivos XAML restantes legível quando a desenvolver aplicativos que contêm fontes XAML.
Optional Property Element Usages
Usos de elemento de propriedade opcional incluem explicitamente gravando as propriedades de conteúdo de elemento que o processador XAML considera implícito. Por exemplo, quando você declara o conteúdo de um Menu, você poderia escolher declarar explicitamente o Items coleção da Menu como um <Menu.Items> marca de elemento de propriedade e cada local MenuItem dentro <Menu.Items>, em vez de usar o comportamento de processador XAML implícito que todos os elementos filho de um Menu deve ser um MenuItem e são colocadas na Items coleção. Sometimes the optional usages can help to visually clarify the object structure as represented in the markup. Or sometimes an explicit property element usage can avoid markup that is technically functional but visually confusing, such as nested markup extensions within an attribute value.
Full typeName.memberName Qualified Attributes
O typeName.nome de associado para um atributo realmente funciona mais universal do que apenas a ocorrência do evento roteado de formulário. Mas em outras situações, esse formulário é supérfluo e deve ser evitada, se apenas para fins de legibilidade e o estilo de marcação. In the following example, each of the three references to the Background attribute are completely equivalent:
<Button Background="Blue">Background</Button>
<Button Button.Background="Blue">Button.Background</Button>
<Button Control.Background="Blue">Control.Background</Button>
Button.Backgroundfunciona porque a pesquisa de qualificado para essa propriedade em Button for bem-sucedida (Background foi herdado do controle) e Button é a classe de elemento de objeto ou uma classe de base. Control.Backgroundfunciona porque a Control na verdade define uma classe Background e Control é um Button classe de base.
However, the following typeName.memberName form example does not work and is thus shown commented:
<!--<Button Label.Background="Blue">Does not work</Button> -->
Label is another derived class of Control, and if you had specified Label.Background within a Label object element, this usage would have worked. No entanto, como Label não é a classe ou classe base de Button, o comportamento do processador XAML especificado é então processar Label.Background como uma propriedade anexada. Label.Backgroundnão é uma propriedade anexada disponível e esse uso falha.
baseTypeName.memberName Property Elements
De maneira semelhante, como o typeName.nome de associado formulário funciona para obter a sintaxe de atributo, um baseTypeName.nome de associado sintaxe funciona para obter a sintaxe de elemento de propriedade. For instance, the following syntax works:
<Button>Control.Background PE
<Control.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="Yellow" Offset="0.0" />
<GradientStop Color="LimeGreen" Offset="1.0" />
</LinearGradientBrush>
</Control.Background>
</Button>
Here, the property element was given as Control.Background even though the property element was contained in Button.
Mas assim como typeName.nome de associado o formulário para os atributos, baseTypeName.nome de associado é ruim estilo na marcação e deve ser evitada.
Consulte também
Conceitos
Visão geral sobre propriedades de dependência
Classes de personalizadas para WPF e XAML