Terminologia de sintaxe XAML
Este tópico define os termos que são usados para descrever os elementos de sintaxe Extensible Application Markup Language (XAML). Esses termos são usados com frequência em todo o restante deste software development kit (SDK). Este tópico expande sobre a terminologia básica introduzida no XAML Overview.
Este tópico contém as seguintes seções.
- Origem da terminologia de sintaxe XAML
- Sintaxe de Elemento de Objeto
- Sintaxe de atributo
- Sintaxe de Elemento Propriedade
- Sintaxe de conteúdo XAML
- Propriedades anexadas
- Eventos anexados
- Namespaces Xml
- Extensões de marcação
- Usos de XAML opcionais e Não Recomendados
- Tópicos relacionados
Origem da terminologia de sintaxe XAML
The XAML sintaxe terminologia definida aqui também definida ou referenciada dentro do XAML especificação de linguagem. XAML um linguagem se baseia XML e a seguir XML regras estruturais. Parte da terminologia compartilha ou é baseada na terminologia usada com frequência ao descrever a linguagem XML ou o XML Document Object Model (DOM).
Sintaxe de Elemento de Objeto
Sintaxe de elemento objeto é a sintaxe de marcação XAML que instancia uma classe common language runtime (CLR) ou estrutura, declarando um elemento XML. Essa sintaxe é semelhante a sintaxe de elemento de Outros linguagens de marcação, sistema autônomo HTML. A sintaxe do elemento de objeto começa com um colchete angular esquerdo (<), seguido imediatamente pelo nome do tipo da classe ou estrutura seja instanciado. Zero ou mais espaços podem seguir o nome do tipo, e zero ou mais atributos também podem ser declarados no elemento objeto, com um ou mais espaços separando cada par nome de atributo = "valor". Finalmente, uma das seguintes opções deve ser verdadeira:
O elemento e tag devem ser fechadas por uma barra (/) seguida imediatamente por um sinal de maior (>).
O marca de abertura deve ser concluída por um sinal de maior (>). Outros elementos do objeto, elementos de propriedade, ou texto interno, podem seguir a tag de abertura. Exatamente o conteúdo que pode estar contido aqui é normalmente restringido pelo modelo de objeto do elemento; consulte a seção "Sintaxe de conteúdo" neste tópico. A tag de fechamento equivalente para o elemento objeto também deve existir, no aninhamento e balanceamento adequados com outros pares de tags de abertura e fechamento.
Por exemplo, o exemplo a seguir é sintaxe de elemento objeto que cria uma nova instância da classe Button, e também especifica um atributo Name e um valor para esse atributo:
<Button Name="CheckoutButton"/>
O exemplo a seguir é sintaxe de elemento objeto que também inclui a sintaxe da propriedade de conteúdo Extensible Application Markup Language (XAML). O texto interno será usado para definir a propriedade de conteúdo TextBox Extensible Application Markup Language (XAML), Text.
<TextBox>This is a Text Box</TextBox>
Sintaxe de atributo
Sintaxe de Atributo é a sintaxe de marcação XAML que define um valor para uma propriedade, ou dá nome a um tratador de eventos para um evento, declarando um atributo em um elemento. O elemento é sempre declarado pela sintaxe de elemento objeto . O nome do atributo deve corresponder ao nome do membro CLR de uma propriedade ou um evento. O nome do atributo é seguido por um operador de atribuição (=). O valor do atributo deve ser uma sequência de caracteres entre duas aspas (").
Para ser configurada via sintaxe de atributo, uma propriedade deve ser pública, deve ter acesso de leitura e escrita, e deve ter um tipo de valor de propriedade que possa ser instanciado ou referenciado por um processador XAML. Para eventos, o evento deve ser público e tem um delegate público. A propriedade ou evento deve ser um membro da classe ou estrutura que é instanciada pelo elemento objeto recipiente.
O valor do atributo é preenchido por um dos seguintes, usando essa ordem de processamento:
Se o processador XAML encontrar uma chave ({), ou um elemento objeto que é derivado de MarkupExtension, a extensão de marcação referenciada é avaliada primeiro em vez de processar a string, e o objeto retornado pelo extensão de marcação é usado. 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é tempo de execução, e não é um novo objeto.
Se a propriedade é declarada com um TypeConverter designado, ou o tipo de valor daquela propriedade é declarado com um TypeConverter atribuído, o valor da sequência de caracteres do atributo é enviado para o conversor de tipos como uma entrada de conversão, e o conversor retornará uma nova instância de objeto.
Se não houver nenhum TypeConverter, será tentada uma conversão direta para o tipo da propriedade. Esse nível final é uma conversão direta entre tipos primitivos, ou uma verificação de nomes em uma enumeração (que retorna os valores correspondentes).
Por exemplo, usando a mesma marcação como mostrado anteriormente, o exemplo a seguir é a sintaxe de atributo utilizada para atribuir um valor da sequência de caracteres para a propriedade Name:
<Button Name="CheckoutButton"/>
The Name propriedade é um membro da tabela membros para o Button classe. Button é uma classe derivada de FrameworkElement classe que define Name.
O processamento de valores de atributo
O valor da sequência de caracteres contida dentro de aspas de abertura e fechamento é processado por um processador XAML. Para propriedades, o comportamento padrão de processamento é determinado pelo tipo da propriedade CLR subjacente. Se a propriedade é um tipo primitivo, o valor do atributo será atribuído com base em conversão implícita da sequência de caracteres ao tipo primitivo relevante. Se a propriedade é uma enumeração, a sequência de caracteres é tratada como um nome definido pela enumeração e o valor da enumeração correspondente será retornado. Se a propriedade não for um tipo primitivo ou enumeração, o valor do atributo deve ser manipulado por um conversor de tipos que é declarado na propriedade em si ou no tipo de destino. O conversor de tipos deve fornecer uma conversão que aceita uma sequência de caracteres e deve resultar em uma instância do tipo da propriedade CLR subjacente. A etapa de conversão também pode ser adiada por um extensão de marcação.
Valores de Atributos de Enumeração
Valores de enumeração XAML são processados intrinsecamente pelos métodos nativos da estrutura Enum.
Para valores de enumeração nonflag, o comportamento nativo é processar a sequência de caracteres de um valor de atributo e resolvê-lo a um dos valores de enumeração. Você não especifica a enumeração no formato enumeração.valor, como você faz no código. Em vez disso, você especifica somente valor, e enumeração é inferido pelo tipo da propriedade você está configurando. Se você especificar um atributo na forma enumeração.valor, ele não será interpretado corretamente.
Para enumerações flagwise, o comportamento baseia-se no método Enum.Parse. Você pode especificar vários valores para uma enumeração flagwise, separando cada valor com uma vírgula. No entanto, não é possível combinar valores de enumeração que não são flagwise. Por exemplo, você não pode usar a sintaxe de vírgulas para tentar criar uma Trigger que atua em várias condições de uma enumeração nonflag:
<!--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. No entanto, uma enumeração desse tipo é StyleSimulations. Você poderia, por exemplo, usar a sintaxe de atributo flagwise delimitado por vírgulas para modificar o exemplo fornecido nos comentários para a classe Glyphs;StyleSimulations = "BoldSimulation" poderia se tornar StyleSimulations = "BoldSimulation,ItalicSimulation".KeyBinding.Modifiers é outra propriedade na qual mais de um valor de enumeração pode ser especificado. No entanto, essa propriedade é um caso especial, porque a enumeração ModifierKeys dá suporte ao seu próprio conversor de tipos. O conversor de tipos para modificadores usa um sinal de adição (+) como um delimitador em vez de uma vírgula (,) para que a sintaxe mais tradicional para representar combinações de teclas, como " ctrl + alt ", seja suportada na marcação.
Referências de nome de membros de propriedades e eventos
Ao especificar um atributo, você pode fazer referência a qualquer propriedade ou evento que existe sistema autônomo um membro do CLR tipo instanciado para o elemento de objeto que contém.
Senão, você pode fazer referência a uma propriedade anexada ou evento anexado, independente do elemento de objeto que os contém.
Você também pode nomear qualquer evento de qualquer objeto que seja acessível através do espaço para nome padrão, usando um typeName.evento nome qualificado parcialmente; essa sintaxe aceita anexar manipuladores para eventos roteados onde o manipulador destina-se a manipular eventos de roteamento de elementos filho, mas o elemento pai não tem também que o evento em sua tabela de membros. Essa sintaxe é parecida com uma sintaxe de evento anexado, mas o evento aqui não é um evento realmente anexado. Em vez disso, você está fazendo referência a um evento com um nome qualificado. Para obter mais informações, consulte Visão geral sobre eventos roteados.
Nomes de propriedade às vezes são fornecidos como o valor de um atributo, em vez do nome do atributo, e esse nome de propriedade também pode incluir qualificadores, tal como a propriedade especificada na forma TipoProprietário. NomeDaPropriedadeDaDependência. 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 e por alguns fatores de contexto, tal como se um estilo ou modelo tem um tipo de destino. Para obter detalhes, consulte:Styling and Templating.
Outro uso para nomes de propriedades é quando um valor de atributo descreve uma relação propriedade-propriedade. Esse recurso é usado para vinculação de dados e para destinos do storyboard e é habilitado pelo PropertyPath classe e seu tipo de conversor. Para obter uma descrição mais completa de semântica de pesquisa, consulte Sintaxe de um PropertyPath XAML.
Sintaxe de Elemento Propriedade
Sintaxe de Elemento Propriedade é uma sintaxe que diverge um pouco da sintaxe XML básica. In XML, o valor de um atributo é uma seqüência de caracteres de fato, com a variação só é possível sendo o formato de codificação em seqüência que está sendo usado. In XAML, você pode atribuir a outros elementos como o valor de uma propriedade do objeto. Esse recurso é habilitado pela sintaxe do elemento propriedade. Em vez da propriedade ser especificada como um atributo na tag de elemento, a propriedade é especificada usando uma tag de abertura de elemento na forma NomeDoTipoDeElemento.NomeDaPropriedade, o valor da propriedade é especificado, e o elemento de propriedade é fechado.
Especificamente, a sintaxe começa com um sinal de menor (<), seguido imediatamente pelo nome do tipo da classe ou estrutura dentro da qual a sintaxe do elemento propriedade está contida. Isso é seguido imediatamente por um único ponto (.), e pelo nome de uma propriedade que deve existir dentro da tabela de membros do tipo especificado, e por um sinal de maior (>). O valor a ser atribuído à propriedade está contido no elemento propriedade. Normalmente, o valor é fornecido como um ou mais elementos objeto, porque especificar objetos como valores é o cenário que a sintaxe do elemento propriedade destina-se a tratar. Finalmente, uma tag de fechamento equivalente especificando a mesma combinação NomeDoTipoDoElemento.NomeDaPropriedade deve ser fornecida, com balanceamento e aninhamento apropriados com outras tags de elemento. Por exemplo, a seguir está a sintaxe de elemento propriedade para a propriedade ContextMenu de um 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 também pode ser fornecido sistema autônomo texto interno, nos casos em que o tipo de propriedade especificado é um tipo de valor primitivo, sistema autônomo String, ou onde for especificado um nome de enumeração. Esses dois usos são incomuns, pois cada um desses casos também oferece suporte à sintaxe de atributo. Um cenário para preencher um elemento de propriedade com uma sequência de caracteres é para propriedades que não são a propriedade de conteúdo XAML mas ainda assim são usadas para representação de texto de interface do usuário, e determinados elementos de espaço em branco, tais como de avanço de linha, são obrigatórios no texto de interface do usuário. Sintaxe de atributo não é capaz de preservar avanços de linha, mas a sintaxe de elemento propriedade pode, desde que preservação significativa de espaço em branco esteja ativa (para obter detalhes, consulte Processamento de Espaço em branco em XAML).
Um elemento de propriedade não é representado no árvore lógica. Um elemento de propriedade é apenas uma sintaxe específica para definir uma propriedade e não é um elemento que possui uma instância ou um objeto fazendo-lo.
Sintaxe de Elemento Propriedade para Tipos de Coleção
A especificação de XAML requer implementações de processador XAML para poder identificar propriedades nas quais o tipo de valor é uma coleção. A implementação WPF baseia-se em código gerenciado, e seu processador XAML identifica os tipos de coleção através de um dos procedimentos:
Implementa IList.
Implementa IDictionary.
É derivado de Array (Para obter mais informações sobre arrays em XAML, consulte x:Array de marcação de extensão.)
Se o tipo de uma propriedade for uma coleção, o tipo de coleção inferido não precisa ser especificado na marcação. Em vez disso, os elementos a serem itens da coleção são especificados como um ou mais elementos filhos do elemento de propriedade tipo de coleção. Cada item tal é avaliado para um objeto durante o carregamento e adicionado à coleção chamando o método Add da coleção implícita. Por exemplo, a propriedade Triggers de Style leva o tipo da coleção especializada TriggerCollection. Mas não é necessário instanciar uma TriggerCollection na marcação. Em vez disso, você especifica um ou mais itens Trigger como elementos contidos no elemento de propriedade Style.Triggers, nos quais Trigger (ou uma classe derivada) é o tipo esperado como o tipo de item para a TriggerCollection implícita e fortemente tipada.
<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 o XAML propriedade Conteúdo para esse tipo e tipos derivados.
Um elemento de coleção implícito cria um membro na árvore lógica, mesmo que ele não apareça na marcação como um elemento. Geralmente o construtor do tipo proprietário faz a instanciação para a coleção que é uma das suas propriedades, o que adiciona a coleção à árvore.
Observação: |
---|
O generic l is e d ictionary interfaces) IList<T> and IDictionary<TKey, TValue>) are not supported for collection detection by the WPF XAML processor. No entanto, é possível usar a classe List<T> como uma classe base, pois ela implementa IList diretamente, ou Dictionary<TKey, TValue> como uma classe base, pois ela implementa IDictionary diretamente. |
Sintaxe de conteúdo XAML
Sintaxe de conteúdo XAML é uma sintaxe que está habilitada somente nas classes que especificam ContentPropertyAttribute como parte da sua declaração de classe. O ContentPropertyAttribute requer um parâmetro que especifica a propriedade pelo nome que é definido como sendo a propriedade de conteúdo para esse tipo de elemento (incluindo as classes derivadas). A propriedade designada, portanto, é a propriedade de conteúdo XAML de um elemento. Quando processado por um processador XAML, qualquer elemento filho ou texto interno que são encontrados entre as tags de abertura e fechamento do elemento será atribuído ao valor da propriedade de conteúdo XAML. Você tem permissão para especificar os elementos de propriedade para a propriedade Conteúdo se você deseja e fizer sua marcação explícita. Essa técnica tem valor ocasional para maior clareza de marcação ou sistema autônomo 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 sistema autônomo elementos relacionados intuitivamente sistema autônomo pai-filho podem ser aninhados diretamente. Rótulos de elemento de propriedade de outras propriedades em um elemento não são atribuídas sistema autônomo "conteúdo"; elas são processadas anteriormente no analisador de fluxo de trabalho e não são consideradas sistema autônomo "conteúdo".
Como com qualquer outra propriedade, a propriedade de conteúdo XAML de um objeto será de um tipo específico. Esse tipo pode ser do tipo Object. O tipo da propriedade de conteúdo ajuda a definir o modelo de conteúdo de um objeto. Por exemplo, um tipo de Object é relaxado no sentido que qualquer objeto pode se tornar o conteúdo, mas mesmo essa digitação relaxada implica que o conteúdo deve ser um único objeto. O único objeto pode ser um objeto da coleção, mas mesmo assim pode haver apenas um objeto de coleção atribuído a ser o conteúdo.
No WPF documentação, modelos de conteúdo para tipos específicos são descritos sistema autônomo páginas de classe para esse tipo ou são gravados sistema autônomo tópicos conceituais separados para sistema autônomo famílias de tipos e vinculados de cada referência a tipo relevante.
Sintaxe de conteúdo para tipos coleção
Para aceitar mais do que um único elemento objeto (ou texto interno) como o conteúdo, o tipo da propriedade de conteúdo deve especificamente ser um tipo de coleção. Semelhante à sintaxe de elemento de propriedade para os tipos de coleção, um processador XAML deve identificar tipos que são tipos de coleção. Se um elemento possui um XAML propriedade e o tipo de conteúdo de XAML conteúdo da propriedade é uma coleção e, em seguida, ele implícitas de tipo de coleção não precisa ser especificado na marcação sistema autônomo um elemento de objeto e o XAML propriedade Content não precisa ser especificado sistema autônomo um elemento de propriedade. Portanto, o modelo de conteúdo aparente na marcação agora pode ter mais de um elemento filho atribuído como o conteúdo. Este é o conteúdo a sintaxe para um Panel classe derivada. Todas as classes derivadas de Panel estabelecem a propriedade de conteúdo XAML como Children, 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>
Observe que nem o elemento de propriedade Children nem o elemento para a UIElementCollection são necessários na marcação. Esse é um recurso de design de XAML para que elementos recursivamente contidos que definem um UI sejam representados mais intuitivamente como uma árvore de elementos aninhados com relações imediatas pai-filho, sem tags entrepostas alheias ou objetos de coleção. Na verdade, UIElementCollection não pode ser especificado na marcação como um elemento de objeto, por design. Como seu único uso pretendido é como uma coleção implícita, UIElementCollection não expõe um construtor público padrão e, portanto, não pode ser instanciado como um elemento de objeto.
Misturando Elementos de Propriedade e Elementos de Objeto em um Objeto com Propriedade de Conteúdo
A especificação XAML declara que um processador XAML pode garantir que elementos de objeto que são usados para preencher a propriedade de conteúdo XAML dentro de um elemento de objeto devem ser contíguos, e não podem ser misturados. Essa restrição contra misturar elementos de propriedade elementos e conteúdo é imposta pelo processador WPF XAML.
Você pode ter um elemento objeto filho como a primeira marcação imediata dentro de um elemento objeto. Em seguida, você pode introduzir elementos propriedade. Ou, você pode especificar um ou mais elementos de propriedades, em seguida, conteúdo, e mais elementos de propriedade. Mas depois que um elemento de propriedade vem de conteúdo, você não pode incluir qualquer conteúdo adicional, você só pode adicionar elementos de propriedade.
Esse requisito de ordem conteúdo / elemento propriedade não se aplica ao texto interno usado como conteúdo. No entanto, ele é ainda um bom estilo de marcação para manter texto interno contíguo, porque será difícil de detectar visualmente significativo espaço em branco na marcação se elementos de propriedade forem intercalados com texto interno.
Propriedades anexadas
Propriedades anexadas são um conceito de programação introduzido no XAML no qual propriedades podem pertencer ou ser definidas por um tipo, mas definidas em qualquer elemento. O cenário primário de uso de propriedades anexadas é habilitar elementos filhos em uma árvore de elementos para relatar informações a um elemento pai sem exigir um modelo de objeto amplamente compartilhado entre todos os elementos. Por outro lado, propriedades anexadas podem ser usadas pelos elementos pai para relatar informações para elementos filhos. Para obter mais informações no objetivo de propriedades anexadas e como criar suas próprias propriedades anexadas, consulte Attached Properties Overview.
Propriedades anexadas utilizam uma sintaxe que superficialmente se assemelha à sintaxe de elemento de propriedade, em que você também especifica uma combinação NomeDeTipo.NomeDaPropriedade. Há duas diferenças importantes:
Você pode usar a combinação NomeDoTipo.NomeDaPropriedade mesmo ao definir uma propriedade anexada através de sintaxe de atributo. Propriedades anexadas são o único caso em que a qualificação do nome da propriedade é um requisito em uma sintaxe de atributo.
Você também pode usar a sintaxe de elemento de propriedade para propriedades anexadas. No entanto, para a sintaxe de elemento propriedade típica, o NomeDoTipo que você especifica é o elemento de objeto que contém o elemento de propriedade. Se você estiver fazendo referência a uma propriedade anexada, o NomeDoTipo é a classe que define a propriedade anexada, não o elemento de objeto que a contém.
Eventos anexados
Eventos anexados são outro conceito de programação introduzido em XAML no qual eventos podem ser definidos por um tipo, mas manipuladores podem ser anexados a qualquer objeto. 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. Manipuladores de eventos anexados são especificados pela sintaxe de atributo. sistema autônomo com eventos anexados, a sintaxe do atributo é expandida para eventos anexados permitir que um typeName.eventName uso do , onde typeName é a classe que fornece Add e Remove acessadores de manipulador de evento para a infra-estrutura de evento anexado, e eventName é o nome do evento.
Namespaces Xml
Nenhum dos exemplos anteriores de sintaxe especificaram um namespace diferente do namespace padrão. Em aplicativos WPF típicos o namespace padrão é especificado para ser o namespace WPF. Você pode especificar espaços para nome diferente de espaço para nome padrão e ainda usar essencialmente os mesmos tipos de sintaxe, mas em qualquer lugar onde uma classe é nomeada não acessível dentro do espaço para nome padrão, esse nome de classe deve ser precedido com o prefixo do namespace de XML que foi usado para MAP o correspondente CLR espaço para nome. Por exemplo, <custom:MyElement/> é sintaxe de elemento de objeto para criar uma instância da classe MyElement, na qual o namespace CLR que contém essa classe (e possivelmente o assembly externo que contém esse namespace) foi anteriormente mapeado para o prefixo custom.
Para obter mais informações sobre namespaces XML e XAML, consulte Espaços de nomes XAML e mapeamentos de espaços de nomes.
Extensões de marcação
XAML define uma entidade de programação de extensão de marcação que permite que um escape do tratamento de processadores XAML de atributos ou elementos de objeto, e adia o processamento para uma classe de suporte. A implementação WPF de um processador XAML usa a classe abstrata MarkupExtension como a base para todas as extensões de marcação suportadas pelo WPF. O caractere que identifica um extensão de marcação para um processador XAML ao usar a sintaxe de atributo é a chave de abertura ({), seguida por qualquer caractere que não seja uma chave de fechamento (}). A primeira sequência de caracteres após a chave de abertura deve fazer referência à classe que oferece o comportamento específico de extensão, na qual a referência pode omitir a subsequência "Extension" se aquela subsequência faz parte do real nome da classe. Daí em diante, pode aparecer um único espaço, e, em seguida, cada caractere subsequente é usado como entrada pela implementação de extensão, até que a chave de fechamento seja encontrada. As extensões de marcação no WPF destinam-se principalmente a fornecer um meio para fazer referência a outros objetos já existentes, ou referências adiadas a objetos que serão avaliados em tempo de execução, enquanto estiver usando a sintaxe de atributo. Por exemplo, uma associação de dados simples é obtida especificando a extensão de marcação {Binding} ao invés do tipo de valor que normalmente uma determinada propriedade receberia. Muitas das extensões de marcação permitem uma sintaxe de atributo para propriedades nas quuais uma sintaxe de atributo não seria possível de outro modo. Por exemplo, um objeto Style é um tipo de referência relativamente complexo que contém várias outras propriedades, cada uma delas também recebe objetos por referência e não primitivos. Mas estilos são normalmente criados como um recurso e, em seguida, referenciados por meio de uma das duas extensões de marcação que solicitam um recurso. A extensão adia a avaliação do valor da propriedade para um recurso de pesquisa e permite fornecer o valor da propriedade Style, levando tipo Style, na sintaxe de atributo da seguinte maneira:
<Button Style="{StaticResource MyStyle}">My button</Button>
Aqui, StaticResource identifica a classe StaticResourceExtension fornecendo a implementação de extensão de marcação. A próxima seqüência de caracteres MyStyle é usado sistema autônomo entrada para o não-padrão StaticResourceExtension construtor, onde o parâmetro pois da seqüência de caracteres de extensão declara o solicitada ResourceKey. MyStyle deve ser o Atributo x:Key valor de um Style definido sistema autônomo um recurso. O uso de Extensão de marcação StaticResource requer que o recurso seja usado para fornecer o valor da propriedade de Style através de lógica de busca de recurso estático no tempo de carregamento.
Para obter mais informações sobre extenções de marcação, consulte Extensão de Marcação e XAML. Para obter uma referência de extensões de marcação e outros recursos de programação XAML, consulte Namespace XAML (x:) Recursos da linguagem e Extensões XAML do Namespace WPF.
Usos de XAML opcionais e Não Recomendados
Usos Opcionais de Elementos de Propriedade
Usos opcionais de elemento de propriedade incluem ser específico sobre "ortografia" de 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 a coleção Items de Menu como uma tag de elemento de propriedade <Menu.Items>, e colocar cada MenuItem dentro de <Menu.Items>, em vez de usar o comportamento implícito do processador XAML em que todos os elementos filhos de um Menu devem ser um MenuItem e são colocados na coleção Items. Às vezes os usos opcionais podem ajudar a esclarecer visualmente a estrutura de objeto como representada na marcação. Ou, às vezes, um uso explícito de elemento de propriedade pode evitar a marcação que é tecnicamente funcional, mas visualmente confusa, tais como extensões de marcação aninhadas dentro de um valor de atributo.
Atributos Qualificados NomeDoTipo.NomeDoMembro Completos
A forma NomeDoTipo.NomeDoMembro para um atributo realmente funciona mais universalmente além do caso de evento roteado, mas em outras aplicações essa forma é supérflua e você deve evitá-la, apenas por motivos de estilo de marcação e para facilitar a leitura. No exemplo a seguir, cada uma das três referências para o atributo Background são totalmente equivalentes:
<Button Background="Blue">Background</Button>
<Button Button.Background="Blue">Button.Background</Button>
<Button Control.Background="Blue">Control.Background</Button>
Button.Background funciona porque a pesquisa qualificada para essa propriedade em Button é bem-sucedida)Background foi herdada de controle) e Button é a classe do elemento de objeto ou uma classe base. Control.Background funciona porque o Control classe realmente define Background e Control é um Button classe base.
No entanto, o seguinte exemplo de forma NomeDoTipo.NomeDoMembro não funciona e, portanto, é mostrado comentado:
<!--<Button Label.Background="Blue">Does not work</Button> -->
Label é outra classe derivada de Control, e se você tivesse especificado Label.Background dentro de um elemento de objeto Label, este uso teria funcionado. No entanto, sistema autônomo Label não é a classe ou classe base de Button, o especificado XAML comportamento de processadores é, em seguida, processar Label.Background sistema autônomo uma propriedade anexada. Label.Background não é uma propriedade anexada e esse uso falha.
Elementos NomeDoTipoBase.NomeDoMembro
De maneira semelhante como a typeName.Nome formulário funciona para obter a sintaxe do atributo, um baseTypeName.Nomesintaxe de trabalha para a sintaxe do elemento de propriedade. Por exemplo, a sintaxe a seguir funciona:
<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>
Aqui, o elemento de propriedade foi fornecido como Control.Background apesar de o elemento de propriedade estar contido no Button.
Mas do mesmo modo que a forma NomeDoTipo.NomeDoMembro usada para atributos, NomeDoTipoBase.NomeDoMembro é um estilo ruim na marcação, e você deve evitá-lo por motivos de estilo.
Consulte também
Conceitos
Visão geral sobre propriedades de dependência