Visão geral do XAML (WPF)XAML overview (WPF)

Este tópico descreve os recursos da linguagem XAML e demonstra como você pode usar o XAML para escrever aplicativos Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF).This topic describes the features of the XAML language and demonstrates how you can use XAML to write Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) applications. Este tópico descreve especificamente o XAML como implementado por WPFWPF.This topic specifically describes XAML as implemented by WPFWPF. O XAML em si é um conceito de linguagem maior que WPFWPF.XAML itself is a larger language concept than WPFWPF.

O que é XAML?What is XAML?

O XAML é uma linguagem de marcação declarativa.XAML is a declarative markup language. Conforme aplicado ao modelo de programação .NET Framework, o XAML simplifica a criação Interface de UsuárioUI de um para um aplicativo .NET Framework.As applied to the .NET Framework programming model, XAML simplifies creating a Interface de UsuárioUI for a .NET Framework application. Você pode criar elementos Interface de UsuárioUI visíveis na marcação XAML declarativa e, em seguida, separar Interface de UsuárioUI a definição da lógica de tempo de execução usando arquivos de código-behind que são adicionados à marcação por meio de definições de classe parcial.You can create visible Interface de UsuárioUI elements in the declarative XAML markup, and then separate the Interface de UsuárioUI definition from the run-time logic by using code-behind files that are joined to the markup through partial class definitions. O XAML representa diretamente a instanciação de objetos em um conjunto específico de tipos de suporte definidos em assemblies.XAML directly represents the instantiation of objects in a specific set of backing types defined in assemblies. Isso é diferente da maioria das outras linguagens de marcação, que são geralmente uma linguagem interpretada sem um vínculo direto para um sistema de tipos de suporte.This is unlike most other markup languages, which are typically an interpreted language without such a direct tie to a backing type system. O XAML habilita um fluxo de trabalho em que partes separadas podem trabalhar na Interface de UsuárioUI e na lógica de um aplicativo, usando ferramentas potencialmente diferentes.XAML enables a workflow where separate parties can work on the Interface de UsuárioUI and the logic of an application, using potentially different tools.

Quando representados como texto, arquivos XAML são arquivos XML que geralmente tem a extensão .xaml.When represented as text, XAML files are XML files that generally have the .xaml extension. Os arquivos podem ser codificados por qualquer codificação XML, mas a codificação como UTF-8 é a usual.The files can be encoded by any XML encoding, but encoding as UTF-8 is typical.

O exemplo a seguir mostra como você pode criar um botão como parte de um Interface de UsuárioUI.The following example shows how you might create a button as part of a Interface de UsuárioUI. Este exemplo destina-se apenas a fornecer uma amostra de como o XAML representa metáforas de programação de Interface de UsuárioUI (ele não é um exemplo completo).This example is just intended to give you a flavor of how XAML represents common Interface de UsuárioUI programming metaphors (it is not a complete sample).

<StackPanel>
  <Button Content="Click Me"/>
</StackPanel>

Sintaxe XAML em breveXAML syntax in brief

As seções a seguir explicam as formas básicas de sintaxe XAML e fornecem um exemplo de marcação curta.The following sections explain the basic forms of XAML syntax, and give a short markup example. Essas seções não se destinam a fornecer informações completas sobre cada forma de sintaxe, por exemplo, de como esses itens são representados no sistema de tipos de suporte.These sections are not intended to provide complete information about each syntax form, such as how these are represented in the backing type system. Para obter mais informações sobre as características específicas de sintaxe XAML para cada uma das formas de sintaxe apresentadas neste tópico, consulte Sintaxe XAML em detalhes.For more information about the specifics of XAML syntax for each of the syntax forms introduced in this topic, see XAML Syntax In Detail.

Grande parte do material nas próximas seções será elementar para você caso você tenha familiaridade anterior com a linguagem XML.Much of the material in the next few sections will be elementary to you, if you have previous familiarity with the XML language. Isso é consequência de um dos princípios básicos de design do XAML.This is a consequence of one of the basic design principles of XAML. A linguagem XAML define os conceitos próprios, mas esses conceitos funcionam dentro da linguagem XML e do formulário de marcação.The XAML language defines concepts of its own, but these concepts work within the XML language and markup form.

Elementos de objeto XAMLXAML object elements

Normalmente, um elemento de objeto declara uma instância de um tipo.An object element typically declares an instance of a type. Esse tipo é definido em assemblies que fornecem os tipos de suporte para uma tecnologia que usa XAML como uma linguagem.That type is defined in the assemblies that provide the backing types for a technology that uses XAML as a language.

A sintaxe de elemento de objeto sempre começa com um colchete de abertura (<).Object element syntax always starts with an opening angle bracket (<). Isso é seguido pelo nome do tipo em que você deseja criar uma instância.This is followed by the name of the type where you want to create an instance. (O nome pode incluir um prefixo, um conceito que será explicado posteriormente.) Depois disso, você pode opcionalmente declarar atributos no elemento do objeto.(The name can possibly include a prefix, a concept that will be explained later.) After this, you can optionally declare attributes on the object element. Para concluir a marca de elemento de objeto, encerre com um colchete angular de fechamento (>).To complete the object element tag, end with a closing angle bracket (>). Você pode usar um formulário de autofechamento que não tem nenhum conteúdo, concluindo a marca com uma barra invertida e um colchete angular de fechamento em sucessão (/ >).You can instead use a self-closing form that does not have any content, by completing the tag with a forward slash and closing angle bracket in succession (/>). Por exemplo, examine novamente o snippet de marcação mostrado anteriormente:For example, look at the previously shown markup snippet again:

<StackPanel>
  <Button Content="Click Me"/>
</StackPanel>

Isso especifica dois elementos de objeto: <StackPanel> (com conteúdo e, posteriormente, uma marca de fechamento) e <Button .../> (o formulário de autofechamento, com vários atributos).This specifies two object elements: <StackPanel> (with content, and a closing tag later), and <Button .../> (the self-closing form, with several attributes). Cada um dos elementos de objeto StackPanel e Button mapeia para o nome de uma classe que é definido pelo WPFWPF e é parte dos assemblies do WPFWPF.The object elements StackPanel and Button each map to the name of a class that is defined by WPFWPF and is part of the WPFWPF assemblies. Quando você especifica uma marca de elemento de objeto, você cria uma instrução para o processamento XAML criar uma nova instância.When you specify an object element tag, you create an instruction for XAML processing to create a new instance. Cada instância é criada chamando o construtor sem parâmetros do tipo subjacente ao analisar e carregar o XAML.Each instance is created by calling the parameterless constructor of the underlying type when parsing and loading the XAML.

Sintaxe de atributo (Propriedades)Attribute syntax (properties)

As propriedades de um objeto geralmente podem ser expressas como atributos do elemento de objeto.Properties of an object can often be expressed as attributes of the object element. Uma sintaxe de atributo nomeia a propriedade que está sendo definida na sintaxe de atributo, seguida pelo operador de atribuição (=).An attribute syntax names the property that is being set in attribute syntax, followed by the assignment operator (=). O valor de um atributo é sempre especificado como uma cadeia de caracteres entre aspas.The value of an attribute is always specified as a string that is contained within quotation marks.

A sintaxe de atributo é a sintaxe de configuração de propriedade mais simplificada e é a sintaxe mais intuitiva para os desenvolvedores que já usaram linguagens de marcação anteriormente.Attribute syntax is the most streamlined property setting syntax and is the most intuitive syntax to use for developers who have used markup languages in the past. Por exemplo, a marcação a seguir cria um botão com texto vermelho e uma tela de fundo azul, além de texto de exibição especificado como Content.For example, the following markup creates a button that has red text and a blue background in addition to display text specified as Content.

<Button Background="Blue" Foreground="Red" Content="This is a button"/>

Sintaxe do elemento PropertyProperty element syntax

Para algumas propriedades de um elemento de objeto, a sintaxe de atributo não é possível porque o objeto ou as informações necessárias para fornecer o valor da propriedade não podem ser expressos adequadamente dentro das restrições de aspas e cadeias de caracteres da sintaxe de atributo.For some properties of an object element, attribute syntax is not possible, because the object or information necessary to provide the property value cannot be adequately expressed within the quotation mark and string restrictions of attribute syntax. Nesses casos é possível usar uma sintaxe diferente, conhecida como sintaxe de elemento de propriedade.For these cases, a different syntax known as property element syntax can be used.

A sintaxe para a marca de início de elemento de propriedade é <typeName.propertyName>.The syntax for the property element start tag is <typeName.propertyName>. Em geral, o conteúdo dessa marca é um elemento Object do tipo que a propriedade usa como seu valor.Generally, the content of that tag is an object element of the type that the property takes as its value. Depois de especificar o conteúdo, você deve fechar o elemento de propriedade com uma marca de fim.After specifying the content, you must close the property element with an end tag. A sintaxe para a marca de fim é </typeName.propertyName>.The syntax for the end tag is </typeName.propertyName>.

Se uma sintaxe de atributo é possível, usá-la é normalmente mais conveniente e permite uma marcação mais compacta, mas isso geralmente é apenas uma questão de estilo e não uma limitação técnica.If an attribute syntax is possible, using the attribute syntax is typically more convenient and enables a more compact markup, but that is often just a matter of style, not a technical limitation. O exemplo a seguir mostra as mesmas propriedades que foram definidas no exemplo de sintaxe de atributo anterior sendo definidas novamente, mas desta vez usando sintaxe de elemento de propriedade para todas as propriedades do Button.The following example shows the same properties being set as in the previous attribute syntax example, but this time by using property element syntax for all properties of the Button.

<Button>
  <Button.Background>
    <SolidColorBrush Color="Blue"/>
  </Button.Background>
  <Button.Foreground>
    <SolidColorBrush Color="Red"/>
  </Button.Foreground>
  <Button.Content>
    This is a button
  </Button.Content>
</Button>

Sintaxe da coleçãoCollection syntax

A linguagem XAML inclui algumas otimizações que produzem uma marcação mais legível.The XAML language includes some optimizations that produce more human-readable markup. Uma otimização desse tipo é tal que, se uma determinada propriedade utiliza um tipo de coleção, os itens que você declara na marcação como elementos filho no valor dessa propriedade tornam-se parte da coleção.One such optimization is that if a particular property takes a collection type, then items that you declare in markup as child elements within that property's value become part of the collection. Nesse caso, uma coleção de elementos de objeto filho é o valor que está sendo definido para a propriedade de coleção.In this case a collection of child object elements is the value being set to the collection property.

O exemplo a seguir mostra a sintaxe de coleção para definir GradientStops valores da propriedade:The following example shows collection syntax for setting values of the GradientStops property:

<LinearGradientBrush>  
  <LinearGradientBrush.GradientStops>  
    <!-- no explicit new GradientStopCollection, parser knows how to find or create -->  
    <GradientStop Offset="0.0" Color="Red" />  
    <GradientStop Offset="1.0" Color="Blue" />  
  </LinearGradientBrush.GradientStops>  
</LinearGradientBrush>  

Propriedades de conteúdo XAMLXAML content properties

O XAML especifica um recurso de linguagem em que uma classe pode atribuir exatamente uma de suas propriedades para ser a propriedade de conteúdo XAML.XAML specifies a language feature whereby a class can designate exactly one of its properties to be the XAML content property. Elementos filho desse elemento de objeto são usados para definir o valor dessa propriedade de conteúdo.Child elements of that object element are used to set the value of that content property. Em outras palavras, para a propriedade de conteúdo exclusivamente, você pode omitir um elemento de propriedade ao definir essa propriedade na marcação XAML e produzir uma metáfora de pai/filho mais visível na marcação.In other words, for the content property uniquely, you can omit a property element when setting that property in XAML markup and produce a more visible parent/child metaphor in the markup.

Por exemplo, Border especifica uma propriedade de conteúdo Childde.For example, Border specifies a content property of Child. Os dois Border elementos a seguir são tratados de forma idêntica.The following two Border elements are treated identically. O primeiro aproveita a sintaxe de propriedade de conteúdo e omite o elemento de propriedade Border.Child.The first one takes advantage of the content property syntax and omits the Border.Child property element. O segundo mostra Border.Child explicitamente.The second one shows Border.Child explicitly.

<Border>  
  <TextBox Width="300"/>  
</Border>  
<!--explicit equivalent-->  
<Border>  
  <Border.Child>  
    <TextBox Width="300"/>  
  </Border.Child>  
</Border>  

Como uma regra da linguagem XAML, o valor de uma propriedade de conteúdo XAML deve ser fornecido inteiramente antes ou inteiramente depois de todos os outros elementos de propriedade nesse elemento de objeto.As a rule of the XAML language, the value of a XAML content property must be given either entirely before or entirely after any other property elements on that object element. Por exemplo, a marcação a seguir não compila:For instance, the following markup does not compile:

<Button>I am a   
  <Button.Background>Blue</Button.Background>  
  blue button</Button>  

Para obter mais informações sobre essa restrição em propriedades de conteúdo XAML, consulte a seção "Propriedades de conteúdo XAML" de Sintaxe XAML em detalhes.For more information about this restriction on XAML content properties, see the "XAML Content Properties" section of XAML Syntax In Detail.

Conteúdo de textoText content

Um número pequeno de elementos XAML pode processar texto diretamente como seu conteúdo.A small number of XAML elements can directly process text as their content. Para habilitar isso, um dos casos a seguir deve ser verdadeiro:To enable this, one of the following cases must be true:

  • A classe deve declarar uma propriedade de conteúdo e essa propriedade de conteúdo deve ser de um tipo atribuível a uma cadeia de caracteres (o tipo Objectpode ser).The class must declare a content property, and that content property must be of a type assignable to a string (the type could be Object). Por exemplo, qualquer ContentControl usa Content como sua propriedade Content e é do tipo Object, e isso dá suporte ao Buttonseguinte uso em uma ContentControl prática, como: <Button>Hello</Button>.For instance, any ContentControl uses Content as its content property and it is type Object, and this supports the following usage on a practical ContentControl such as a Button: <Button>Hello</Button>.

  • O tipo deve declarar um conversor de tipo e, nesse caso, o conteúdo de texto é usado como texto de inicialização para esse conversor de tipo.The type must declare a type converter, in which case the text content is used as initialization text for that type converter. Por exemplo, <Brush>Blue</Brush>.For example, <Brush>Blue</Brush>. Esse caso é menos comum na prática.This case is less common in practice.

  • O tipo deve ser um primitivo conhecido de linguagem XAML.The type must be a known XAML language primitive.

Propriedades de conteúdo e sintaxe de coleção combinadasContent properties and collection syntax combined

Considere este exemplo:Consider this example:

<StackPanel>  
  <Button>First Button</Button>  
  <Button>Second Button</Button>  
</StackPanel>  

Aqui, cada Button um é um elemento filho StackPanelde.Here, each Button is a child element of StackPanel. Isso é uma marcação otimizada e intuitiva que omite duas marcas por dois motivos diferentes.This is a streamlined and intuitive markup that omits two tags for two different reasons.

  • Elemento de Propriedade StackPanel. Children omitido: StackPanel deriva de Panel.Omitted StackPanel.Children property element: StackPanel derives from Panel. Paneldefine Panel.Children como sua propriedade de conteúdo XAML.Panel defines Panel.Children as its XAML content property.

  • Elemento de objeto UIElementcollection omitido: A Panel.Children propriedade usa o tipo UIElementCollection, que implementa IList.Omitted UIElementCollection object element: The Panel.Children property takes the type UIElementCollection, which implements IList. A marca do elemento da coleção pode ser omitida, com base nas regras XAML para processamento de IListcoleções, como.The collection's element tag can be omitted, based on the XAML rules for processing collections such as IList. (Nesse caso, UIElementCollection na verdade não pode ser instanciado porque não expõe um construtor sem parâmetros, e é por isso que o UIElementCollection elemento Object é mostrado comentado).(In this case, UIElementCollection actually cannot be instantiated because it does not expose a parameterless constructor, and that is why the UIElementCollection object element is shown commented out).

<StackPanel>  
  <StackPanel.Children>  
    <!--<UIElementCollection>-->  
    <Button>First Button</Button>  
    <Button>Second Button</Button>  
    <!--</UIElementCollection>-->  
  </StackPanel.Children>  
</StackPanel>  

Sintaxe de atributo (eventos)Attribute syntax (events)

A sintaxe de atributo também pode ser usada para os membros que são eventos, em vez de propriedades.Attribute syntax can also be used for members that are events rather than properties. Nesse caso, o nome do atributo é o nome do evento.In this case, the attribute's name is the name of the event. A implementação de WPF de eventos para XAML, o valor do atributo é o nome de um manipulador que implementa o delegado do evento.In the WPF implementation of events for XAML, the attribute's value is the name of a handler that implements that event's delegate. Por exemplo, a marcação a seguir atribui um manipulador para o Click evento a um Button criado na marcação:For example, the following markup assigns a handler for the Click event to a Button created in markup:

<Page 
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="ExampleNamespace.ExamplePage">
  <Button Click="Button_Click" >Click Me!</Button>
</Page>

Há muito mais envolvido no uso de eventos e XAML no WPF do que apenas esse exemplo da sintaxe de atributo.There is more to events and XAML in WPF than just this example of the attribute syntax. Por exemplo, você talvez esteja se perguntando o que o ClickHandler referenciado aqui representa e como ele está definido.For example, you might wonder what the ClickHandler referenced here represents and how it is defined. Isso será explicado na seção Eventos e XAML Code-Behind, posteriormente neste tópico.This will be explained in the upcoming Events and XAML Code-Behind section of this topic.

Caso e espaço em branco em XAMLCase and white space in XAML

Em termos gerais, o XAML diferencia maiúsculas e minúsculas.XAML is generally speaking case sensitive. Para fins de resolução de tipos de suporte, o XAML WPF diferencia maiúsculas e minúsculas pelas mesmas regras que o CLR diferencia maiúsculas e minúsculas.For purposes of resolving backing types, WPF XAML is case sensitive by the same rules that the CLR is case sensitive. Elementos de objeto, elementos de propriedade e nomes de atributo devem ser especificados usando diferenciação de maiúsculas e minúsculas quando comparados pelo nome ao tipo subjacente no assembly ou a um membro de um tipo.Object elements, property elements, and attribute names must all be specified by using the sensitive casing when compared by name to the underlying type in the assembly, or to a member of a type. Primitivos e palavras-chave de linguagem XAML também diferenciam maiúsculas e minúsculas.XAML language keywords and primitives are also case sensitive. Os valores nem sempre diferenciam maiúsculas e minúsculas.Values are not always case sensitive. A diferenciação de maiúsculas e minúsculas em valores dependerá do comportamento do conversor de tipo associado com a propriedade que recebe o valor ou do tipo de valor da propriedade.Case sensitivity for values will depend on the type converter behavior associated with the property that takes the value, or the property value type. Por exemplo, as propriedades que usam Boolean o tipo podem usar true um True ou como valores equivalentes, mas somente porque a conversão de tipo de analisador XAML do Boolean WPF nativo para a cadeia de caracteres já permite isso como equivalentes.For example, properties that take the Boolean type can take either true or True as equivalent values, but only because the native WPF XAML parser type conversion for string to Boolean already permits these as equivalents.

Os processadores e serializadores WPF XAML ignorarão ou descartarão todos os espaços em branco não significativos e normalizarão qualquer espaço em branco significativo.WPF XAML processors and serializers will ignore or drop all nonsignificant white space, and will normalize any significant white space. Isso é consistente com as recomendações de comportamento de espaço em branco padrão da especificação XAML.This is consistent with the default white-space behavior recommendations of the XAML specification. Esse comportamento geralmente é importante apenas quando você especifica cadeias de caracteres dentro de propriedades de conteúdo XAML.This behavior is generally only of consequence when you specify strings within XAML content properties. Em termos mais simples, o XAML converte caracteres de espaço, avanço de linha e tabulação em espaços e, em seguida, mantém um espaço se este é encontrado em qualquer uma das extremidades de uma cadeia de caracteres contígua.In simplest terms, XAML converts space, linefeed and tab characters into spaces, and then preserves one space if found at either end of a contiguous string. A explicação completa do tratamento de espaço em branco XAML não é abordada neste tópico.The full explanation of XAML white-space handling is not covered in this topic. Para obter detalhes, confira processamento de espaço em branco em XAML.For details, see White space processing in XAML.

Extensões de marcaçãoMarkup extensions

Extensões de marcação são um conceito de linguagem XAML.Markup extensions are a XAML language concept. Quando usados para fornecer o valor de uma sintaxe de atributo, chaves ({ e }) indicam um uso de extensão de marcação.When used to provide the value of an attribute syntax, curly braces ({ and }) indicate a markup extension usage. Esse uso direciona o processamento XAML para escape do tratamento geral de valores de atributo como uma cadeia de caracteres literal ou um valor conversível em cadeia de caracteres.This usage directs the XAML processing to escape from the general treatment of attribute values as either a literal string or a string-convertible value.

As extensões de marcação mais comuns usadas na programação de aplicativos WPFWPF são Binding (usada para expressões de vinculação de dados) e as referências de recurso StaticResource e DynamicResource.The most common markup extensions used in WPFWPF application programming are Binding, used for data binding expressions, and the resource references StaticResource and DynamicResource. Usando extensões de marcação, você pode usar a sintaxe de atributo para fornecer valores para propriedades mesmo que essas propriedades não deem suporte a uma sintaxe de atributo em geral.By using markup extensions, you can use attribute syntax to provide values for properties even if that property does not support an attribute syntax in general. Extensões de marcação geralmente usam tipos de expressão intermediários para habilitar recursos como o adiamento de valores ou fazem referência a outros objetos que só estão presentes em tempo de execução.Markup extensions often use intermediate expression types to enable features such as deferring values or referencing other objects that are only present at run time.

Por exemplo, a marcação a seguir define o valor da Style propriedade usando a sintaxe do atributo.For example, the following markup sets the value of the Style property using attribute syntax. A Style propriedade usa uma instância Style da classe, que, por padrão, não pôde ser instanciada por uma cadeia de caracteres de sintaxe de atributo.The Style property takes an instance of the Style class, which by default could not be instantiated by an attribute syntax string. Mas nesse caso, o atributo referencia uma extensão de marcação específica, StaticResource.But in this case, the attribute references a particular markup extension, StaticResource. Quando essa extensão de marcação é processada, ela retorna uma referência a um estilo que foi anteriormente instanciado como um recurso com chave em um dicionário de recursos.When that markup extension is processed, it returns a reference to a style that was previously instantiated as a keyed resource in a resource dictionary.

<Page.Resources>
  <SolidColorBrush x:Key="MyBrush" Color="Gold"/>
  <Style TargetType="Border" x:Key="PageBackground">
    <Setter Property="Background" Value="Blue"/>
  </Style>
</Page.Resources>
<StackPanel>
  <Border Style="{StaticResource PageBackground}">
  </Border>
</StackPanel>

Para uma referência listando todas as extensões de marcação para XAML implementado especificamente no WPF, consulte Extensões XAML WPF.For a reference listing of all markup extensions for XAML implemented specifically in WPF, see WPF XAML Extensions. Para obter uma listagem de referência das extensões de marcação que são definidas pelo System. XAML e estão mais amplamente disponíveis para .NET Framework implementações XAML, consulte XAML namespace (x:) Recursosde linguagem.For a reference listing of the markup extensions that are defined by System.Xaml and are more widely available for .NET Framework XAML implementations, see XAML Namespace (x:) Language Features. Para obter mais informações sobre conceitos de extensão de marcação, consulte Extensões de marcação e XAML WPF.For more information about markup extension concepts, see Markup Extensions and WPF XAML.

Conversores de tipoType converters

Na seção Resumo sobre sintaxe XAML, foi mencionado que o valor do atributo deve poder ser definido por uma cadeia de caracteres.In the XAML Syntax in Brief section, it was stated that the attribute value must be able to be set by a string. O tratamento nativo básico de como as String cadeias de caracteres são convertidas em outros tipos de objeto ou valores primitivos baseia-se no próprio tipo, além do processamento nativo para determinados tipos DateTime , como ou Uri.The basic, native handling of how strings are converted into other object types or primitive values is based on the String type itself, in addition to native processing for certain types such as DateTime or Uri. Mas muitos tipos WPFWPF ou membros desses tipos estendem o comportamento de processamento de atributos de cadeias de caracteres básicos, de modo que instâncias de tipos de objeto mais complexos podem ser especificadas como cadeias de caracteres e atributos.But many WPFWPF types or members of those types extend the basic string attribute processing behavior, in such a way that instances of more complex object types can be specified as strings and attributes.

A Thickness estrutura é um exemplo de um tipo que tem uma conversão de tipo habilitada para usos XAML.The Thickness structure is an example of a type that has a type conversion enabled for XAML usages. Thicknessindica medidas em um retângulo aninhado e é usado como o valor para propriedades como Margin.Thickness indicates measurements within a nested rectangle and is used as the value for properties such as Margin. Ao colocar um conversor de tipo Thicknessno, todas as propriedades que Thickness usam um são mais fáceis de especificar em XAML porque podem ser especificadas como atributos.By placing a type converter on Thickness, all properties that use a Thickness are easier to specify in XAML because they can be specified as attributes. O exemplo a seguir usa uma conversão de tipo e uma sintaxe de atributo para fornecer Marginum valor para:The following example uses a type conversion and attribute syntax to provide a value for a Margin:

<Button Margin="10,20,10,30" Content="Click me"/>

O exemplo de sintaxe de atributo anterior é equivalente ao seguinte exemplo de sintaxe mais detalhada, Margin em que o é definido por meio da sintaxe Thickness do elemento de propriedade que contém um elemento Object.The previous attribute syntax example is equivalent to the following more verbose syntax example, where the Margin is instead set through property element syntax containing a Thickness object element. As quatro propriedades de chave Thickness de são definidas como atributos na nova instância:The four key properties of Thickness are set as attributes on the new instance:

<Button Content="Click me">
  <Button.Margin>
    <Thickness Left="10" Top="20" Right="10" Bottom="30"/>
  </Button.Margin>
</Button>

Observação

Há também um número limitado de objetos em que a conversão de tipo é a única maneira pública de definir uma propriedade para esse tipo sem envolver uma subclasse, porque o próprio tipo não tem um construtor com parâmetros.There are also a limited number of objects where the type conversion is the only public way to set a property to that type without involving a subclass, because the type itself does not have a parameterless constructor. Um exemplo é Cursor.An example is Cursor.

Para obter mais informações sobre como a conversão de tipo e seu uso da sintaxe de atributo têm suporte, consulte TypeConverters e XAML.For more information on how type conversion and its use for attribute syntax is supported, see TypeConverters and XAML.

Elementos raiz XAML e namespaces XAMLXAML root elements and XAML namespaces

Um arquivo XAML deve ter apenas um elemento raiz para que ele seja tanto um arquivo XMLXML bem formado quanto um arquivo XAML válido.A XAML file must have only one root element, in order to be both a well-formed XMLXML file and a valid XAML file. Para cenários típicos do WPF, você usa um elemento raiz que tem um significado proeminente no modelo de aplicativo do WPF ( Window por Page exemplo, ou para ResourceDictionary uma página, para um dicionário Application externo ou para a definição do aplicativo).For typical WPF scenarios, you use a root element that has a prominent meaning in the WPF application model (for example, Window or Page for a page, ResourceDictionary for an external dictionary, or Application for the application definition). O exemplo a seguir mostra o elemento raiz de um arquivo XAML típico para WPFWPF uma página, com o elemento raiz Pagede.The following example shows the root element of a typical XAML file for a WPFWPF page, with the root element of Page.

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
</Page>

O elemento raiz também contém os atributos xmlns e xmlns:x.The root element also contains the attributes xmlns and xmlns:x. Esses atributos indicam a um processador XAML quais namespaces XAML contêm as definições de tipo para tipos de suporte que a marcação referenciará como elementos.These attributes indicate to a XAML processor which XAML namespaces contain the type definitions for backing types that the markup will reference as elements. O atributo xmlns indica especificamente o namespace XAML padrão.The xmlns attribute specifically indicates the default XAML namespace. Dentro do namespace XAML padrão, os elementos de objeto na marcação podem ser especificados sem um prefixo.Within the default XAML namespace, object elements in the markup can be specified without a prefix. Para a maioria dos cenários de aplicativo WPFWPF e para quase todos os exemplos fornecidos nas seções do WPFWPF do SDKSDK, o namespace XAML padrão é mapeado para o namespace http://schemas.microsoft.com/winfx/2006/xaml/presentation do WPFWPF.For most WPFWPF application scenarios, and for almost all of the examples given in the WPFWPF sections of the SDKSDK, the default XAML namespace is mapped to the WPFWPF namespace http://schemas.microsoft.com/winfx/2006/xaml/presentation. O atributo xmlns:x indica um namespace XAML adicional, que mapeia o namespace http://schemas.microsoft.com/winfx/2006/xaml da linguagem XAML.The xmlns:x attribute indicates an additional XAML namespace, which maps the XAML language namespace http://schemas.microsoft.com/winfx/2006/xaml.

Esse uso de xmlns para definir um escopo para uso e mapeamento de um namescope é consistente com a especificação do XML 1.0.This usage of xmlns to define a scope for usage and mapping of a namescope is consistent with the XML 1.0 specification. Namescopes XAML são diferentes de namescopes XML apenas porque um namescope XAML também implica algo sobre como os elementos do namescope têm suporte de tipos quando se trata de resolução de tipo e análise do XAML.XAML namescopes are different from XML namescopes only in that a XAML namescope also implies something about how the namescope's elements are backed by types when it comes to type resolution and parsing the XAML.

Observe que os atributos xmlns são estritamente necessários somente no elemento raiz de cada arquivo XAML.Note that the xmlns attributes are only strictly necessary on the root element of each XAML file. As definições do xmlns serão aplicadas a todos os elementos descendentes do elemento raiz (esse comportamento é novamente consistente com a especificação XML 1.0 para xmlns). Atributos xmlns também são permitidos em outros elementos abaixo da raiz e se aplicariam a quaisquer elementos descendentes do elemento definidor.xmlns definitions will apply to all descendant elements of the root element (this behavior is again consistent with the XML 1.0 specification for xmlns.) xmlns attributes are also permitted on other elements underneath the root, and would apply to any descendant elements of the defining element. No entanto, definição ou redefinição frequente de namespaces XAML pode resultar em um estilo de marcação XAML difícil de ler.However, frequent definition or redefinition of XAML namespaces can result in a XAML markup style that is difficult to read.

A implementação WPFWPF do seu processador XAML inclui uma infraestrutura com reconhecimento dos assemblies de núcleo do WPF.The WPFWPF implementation of its XAML processor includes an infrastructure that has awareness of the WPF core assemblies. O assemblies de núcleo do WPFWPF são conhecidos por conter os tipos que dão suporte a mapeamentos do WPFWPF para o namespace XAML padrão.The WPFWPF core assemblies are known to contain the types that support the WPFWPF mappings to the default XAML namespace. Isso é habilitado por meio da configuração que faz parte de seu arquivo de build do projeto e dos sistemas de projeto e build do WPF.This is enabled through configuration that is part of your project build file and the WPF build and project systems. Portanto, a declaração de namespace XAML padrão como o xmlns padrão é tudo o que é necessário para fazer referência a elementos XAML que vêm de assemblies WPFWPF.Therefore, declaring the default XAML namespace as the default xmlns is all that is necessary in order to reference XAML elements that come from WPFWPF assemblies.

O prefixo x:The x: prefix

No exemplo de elemento raiz anterior, o prefixo x: foi usado para mapear o namespace XAML http://schemas.microsoft.com/winfx/2006/xaml, que é o namespace XAML dedicado que dá suporte a constructos de linguagem XAML.In the previous root element example, the prefix x: was used to map the XAML namespace http://schemas.microsoft.com/winfx/2006/xaml, which is the dedicated XAML namespace that supports XAML language constructs. Esse prefixo x: é usado para mapear esse namespace XAML nos modelos para projetos, em exemplos e na documentação em todo este SDKSDK.This x: prefix is used for mapping this XAML namespace in the templates for projects, in examples, and in documentation throughout this SDKSDK. O namespace XAML para a linguagem XAML contém várias construções de programação que você usará com muita frequência em seu XAML.The XAML namespace for the XAML language contains several programming constructs that you will use very frequently in your XAML. A seguir está uma lista dos constructos de programação de prefixo x: mais comuns que você usará:The following is a listing of the most common x: prefix programming constructs you will use:

  • x:Key: Define uma chave exclusiva para cada recurso em um ResourceDictionary (ou conceitos de dicionário semelhantes em outras estruturas).x:Key: Sets a unique key for each resource in a ResourceDictionary (or similar dictionary concepts in other frameworks). x:Key provavelmente será responsável por 90% dos usos de x: que você verá na marcação de um aplicativo WPF típico.x:Key will probably account for 90% of the x: usages you will see in a typical WPF application's markup.

  • x:Class: Especifica o namespace CLR e o nome de classe para a classe que fornece code-behind para uma página XAML.x:Class: Specifies the CLR namespace and class name for the class that provides code-behind for a XAML page. Você deve ter uma classe desse tipo para dar suporte a code-behind segundo o modelo de programação do WPF e, portanto, você quase sempre vê x: mapeado, mesmo que não existam recursos.You must have such a class to support code-behind per the WPF programming model, and therefore you almost always see x: mapped, even if there are no resources.

  • x:Name: Especifica um nome de objeto de tempo de execução para a instância que existe no código de tempo de execução depois que um elemento de objeto é processado.x:Name: Specifies a run-time object name for the instance that exists in run-time code after an object element is processed. Em geral, você usará frequentemente uma propriedade equivalente definida pelo WPF para X:Name.In general, you will frequently use a WPF-defined equivalent property for x:Name. Essas propriedades mapeiam especificamente para uma propriedade de suporte a CLR e, portanto, são mais convenientes para programação de aplicativo, em que você frequentemente usa código em tempo de execução para localizar os elementos nomeados do XAML inicializado.Such properties map specifically to a CLR backing property and are thus more convenient for application programming, where you frequently use run time code to find the named elements from initialized XAML. A propriedade mais comum é FrameworkElement.Name.The most common such property is FrameworkElement.Name. Você ainda pode usar x:Name quando a propriedade de nível Name de estrutura do WPF equivalente não tiver suporte em um tipo específico.You might still use x:Name when the equivalent WPF framework-level Name property is not supported in a particular type. Isso ocorre em determinados cenários de animação.This occurs in certain animation scenarios.

  • x:static: Habilita uma referência que retorna um valor estático que não é, de outra forma, uma propriedade compatível com XAML.x:Static: Enables a reference that returns a static value that is not otherwise a XAML-compatible property.

  • x:Type: Constrói uma Type referência com base em um nome de tipo.x:Type: Constructs a Type reference based on a type name. Isso é usado para especificar atributos que usam Type, Style.TargetTypecomo, embora frequentemente a propriedade tenha cadeia de caracteresType nativa para conversão de forma que o uso da extensão de marcação x:Type seja opcional.This is used to specify attributes that take Type, such as Style.TargetType, although frequently the property has native string-to-Type conversion in such a way that the x:Type markup extension usage is optional.

Há constructos de programação adicionais no prefixo x:/namespace XAML que não são tão comuns.There are additional programming constructs in the x: prefix/XAML namespace, which are not as common. Para obter detalhes, consulte XAML namespace (x:) Recursosde linguagem.For details, see XAML Namespace (x:) Language Features.

Prefixos personalizados e tipos personalizados em XAMLCustom prefixes and custom types in XAML

Para seus próprios assemblies personalizados ou para assemblies fora do núcleo do WPF de PresentationCore, PresentationFramework e WindowsBase, você pode especificar o assembly como parte de um mapeamento xmlns personalizado.For your own custom assemblies, or for assemblies outside the WPF core of PresentationCore, PresentationFramework and WindowsBase, you can specify the assembly as part of a custom xmlns mapping. Você pode então referenciar tipos desse assembly em seu XAML, desde que esse tipo esteja corretamente implementado para dar suporte aos usos XAML que você está tentando executar.You can then reference types from that assembly in your XAML, so long as that type is correctly implemented to support the XAML usages you are attempting.

A seguir, um exemplo bem básico de como prefixos personalizados funcionam na marcação XAML.The following is a very basic example of how custom prefixes work in XAML markup. O prefixo custom é definido na marca do elemento raiz e mapeado para um assembly específico que é empacotado e está disponível com o aplicativo.The prefix custom is defined in the root element tag, and mapped to a specific assembly that is packaged and available with the application. Esse assembly contém um tipo NumericUpDown, que é implementado para dar suporte ao uso geral do XAML, bem como usar uma herança de classe que permite sua inserção, nesse momento específico, em um modelo de conteúdo XAML WPF.This assembly contains a type NumericUpDown, which is implemented to support general XAML usage as well as using a class inheritance that permits its insertion at this particular point in a WPF XAML content model. Uma instância desse controle NumericUpDown é declarada como um elemento de objeto, usando o prefixo para que um analisador XAML saiba qual namespace XAML contém o tipo e, portanto, a localização do assembly de suporte que contém a definição de tipo.An instance of this NumericUpDown control is declared as an object element, using the prefix so that a XAML parser knows which XAML namespace contains the type, and therefore where the backing assembly is that contains the type definition.

<Page  
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"   
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"   
    xmlns:custom="clr-namespace:NumericUpDownCustomControl;assembly=CustomLibrary"  
    >  
  <StackPanel Name="LayoutRoot">  
    <custom:NumericUpDown Name="numericCtrl1" Width="100" Height="60"/>  
...  
  </StackPanel>  
</Page>  

Para obter mais informações sobre tipos personalizados em XAML, consulte XAML e classes personalizadas para WPF.For more information about custom types in XAML, see XAML and Custom Classes for WPF.

Para obter mais informações sobre como os namespaces XML e os namespaces do código de suporte em assemblies são relacionados, consulte Namespaces XAML e mapeamento de namespace para XAML WPF.For more information about how XML namespaces and the namespaces of the backing code in assemblies are related, see XAML Namespaces and Namespace Mapping for WPF XAML.

Eventos e código XAML-por trásEvents and XAML code-behind

A maioria dos aplicativos WPFWPF consistem em ambos marcação XAML e code-behind.Most WPFWPF applications consist of both XAML markup and code-behind. Dentro de um projeto, o XAML é escrito como .xaml um arquivo e uma linguagem CLR, como o Microsoft Visual Basic C# ou é usado para gravar um arquivo code-behind.Within a project, the XAML is written as a .xaml file, and a CLR language such as Microsoft Visual Basic or C# is used to write a code-behind file. Quando um arquivo XAML é compilado com marcação como parte dos modelos de aplicativos e programação WPF, o local do arquivo XAML code-behind para um arquivo XAML é identificado por meio da especificação de um namespace e classe como o atributo x:Class do elemento raiz do XAML.When a XAML file is markup compiled as part of the WPF programming and application models, the location of the XAML code-behind file for a XAML file is identified by specifying a namespace and class as the x:Class attribute of the root element of the XAML.

Nos exemplos até agora você viu vários botões, mas nenhum deles tinha ainda qualquer comportamento lógico associado.In the examples so far, you have seen several buttons, but none of these buttons had any logical behavior associated with them yet. O mecanismo de nível de aplicativo primário para adicionar um comportamento para um elemento de objeto é usar um evento existente da classe de elemento e escrever um manipulador específico para o evento que é invocado quando esse evento é acionado em tempo de execução.The primary application-level mechanism for adding a behavior for an object element is to use an existing event of the element class, and to write a specific handler for that event that is invoked when that event is raised at run time. O nome do evento e o nome do manipulador a usar são especificados na marcação, enquanto o código que implementa o manipulador é definido no code-behind.The event name and the name of the handler to use are specified in the markup, whereas the code that implements your handler is defined in the code-behind.

<Page 
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="ExampleNamespace.ExamplePage">
  <Button Click="Button_Click" >Click Me!</Button>
</Page>
namespace ExampleNamespace
{
  public partial class ExamplePage
  {
    void Button_Click(object sender, RoutedEventArgs e)
    {
      Button b = e.Source as Button;
      b.Foreground = Brushes.Red;
    }
  }
}
Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
    Dim b As Button = e.Source
    b.Foreground = Brushes.Red
End Sub

Observe que o arquivo code-behind usa o namespace CLR ExampleNamespace e declara ExamplePage como uma classe parcial dentro desse namespace.Notice that the code-behind file uses the CLR namespace ExampleNamespace and declares ExamplePage as a partial class within that namespace. Isso é comparável ao valor do atributo x:Class de ExampleNamespace.ExamplePageThis parallels the x:Class attribute value of ExampleNamespace.ExamplePage que foi fornecido na raiz da marcação.that was provided in the markup root. O compilador de marcação do WPF criará uma classe parcial para qualquer arquivo XAML compilado, derivando uma classe do tipo de elemento raiz.The WPF markup compiler will create a partial class for any compiled XAML file, by deriving a class from the root element type. Quando você fornece code-behind que também define a mesma classe parcial, o código resultante é combinado dentro do mesmo namespace e classe do aplicativo compilado.When you provide code-behind that also defines the same partial class, the resulting code is combined within the same namespace and class of the compiled application.

Para obter mais informações sobre requisitos de programação code-behind no WPF, consulte a seção "Code-behind, manipulador de eventos e requisitos de classe parcial" de Code-Behind e XAML no WPF.For more information about requirements for code-behind programming in WPF, see the "Code-behind, Event Handler, and Partial Class Requirements" section of Code-Behind and XAML in WPF.

Se você não deseja criar um arquivo code-behind separado, você também pode embutir seu código em um arquivo XAML.If you do not want to create a separate code-behind file, you can also inline your code in a XAML file. No entanto, o código embutido é uma técnica menos versátil que tem limitações significativas.However, inline code is a less versatile technique that has substantial limitations. Para obter detalhes, consulte Code-behind e XAML no WPF.For details, see Code-Behind and XAML in WPF.

Eventos roteadosRouted events

Um recurso de evento específico que é fundamental para WPFWPF é um evento roteado.A particular event feature that is fundamental to WPFWPF is a routed event. Eventos roteados habilitam um elemento para manipular um evento que foi acionado por um elemento diferente, desde que os elementos estejam conectados por meio de uma relação de árvore.Routed events enable an element to handle an event that was raised by a different element, as long as the elements are connected through a tree relationship. Ao especificar o tratamento de eventos com um atributo XAML, o evento roteado pode ser escutado e manipulado em qualquer elemento, incluindo elementos que não listam esse evento específico na tabela de membros de classe.When specifying event handling with a XAML attribute, the routed event can be listened for and handled on any element, including elements that do not list that particular event in the class members table. Isso é feito qualificando o atributo de nome do evento com o nome de classe proprietária.This is accomplished by qualifying the event name attribute with the owning class name. Por exemplo, o pai StackPanel no exemplo em StackPanel andamento Button.Click Click / Button poderia registrar um manipulador para o evento do botão do elemento StackPanel filho, especificando o atributo no o elemento Object, com o nome do manipulador como o valor do atributo.For instance, the parent StackPanel in the ongoing StackPanel / Button example could register a handler for the child element button's Click event by specifying the attribute Button.Click on the StackPanel object element, with your handler name as the attribute value. Para obter mais informações sobre como eventos roteados funcionam, consulte Visão geral de eventos roteados.For more information about how routed events work, see Routed Events Overview.

Elementos nomeados XAMLXAML named elements

Por padrão, a instância do objeto criada em um grafo de objeto pelo processamento de um elemento de objeto XAML não tem um identificador exclusivo nem uma referência de objeto.By default, the object instance that is created in an object graph by processing a XAML object element does not possess a unique identifier or object reference. Por outro lado, se você chamar um construtor no código, você quase sempre usará o resultado do construtor para definir uma variável para a instância construída, de modo que você poderá fazer referência à instância posteriormente no seu código.In contrast, if you call a constructor in code, you almost always use the constructor result to set a variable to the constructed instance, so that you can reference the instance later in your code. Para oferecer acesso padronizado a objetos que criados por meio de uma definição de marcação, o XAML define o atributo X:Name.In order to provide standardized access to objects that were created through a markup definition, XAML defines the x:Name attribute. Você pode definir o valor do atributo x:Name em qualquer elemento de objeto.You can set the value of the x:Name attribute on any object element. Em seu code-behind, o identificador escolhido é equivalente a uma variável de instância que faz referência à instância construída.In your code-behind, the identifier you choose is equivalent to an instance variable that refers to the constructed instance. Em todos os aspectos, elementos nomeados funcionam como se fossem instâncias de objeto (o nome faz referência a essa instância) e o code-behind pode fazer referência aos elementos nomeados para manipular interações de tempo de execução dentro do aplicativo.In all respects, named elements function as if they were object instances (the name references that instance), and your code-behind can reference the named elements to handle run-time interactions within the application. Essa conexão entre instâncias e variáveis é realizada pelo compilador de marcação XAML do WPF e, mais especificamente, envolve recursos e padrões InitializeComponent como esse não será discutido em detalhes neste tópico.This connection between instances and variables is accomplished by the WPF XAML markup compiler, and more specifically involve features and patterns such as InitializeComponent that will not be discussed in detail in this topic.

Elementos XAML de nível de estrutura do WPF Name herdam uma propriedade, que é equivalente ao x:Name atributo XAML definido.WPF framework-level XAML elements inherit a Name property, which is equivalent to the XAML defined x:Name attribute. Algumas outras classes também fornecem equivalentes de nível de propriedade para x:Name, que também geralmente é definido como uma propriedade Name.Certain other classes also provide property-level equivalents for x:Name, which is also generally defined as a Name property. Em termos gerais, se você não encontrar uma propriedade Name na tabela de membros de seu elemento/tipo escolhido, use x:Name em vez disso.Generally speaking, if you cannot find a Name property in the members table for your chosen element/type, use x:Name instead. Os x:Name valores fornecerão um identificador para um elemento XAML que pode ser usado em tempo de execução, seja por subsistemas específicos ou por métodos de utilitário FindName, como.The x:Name values will provide an identifier to a XAML element that can be used at run time, either by specific subsystems or by utility methods such as FindName.

O exemplo a seguir Name define em StackPanel um elemento.The following example sets Name on a StackPanel element. Em seguida, um manipulador em Button um no StackPanel que faz StackPanel referência ao por meio buttonContainer de sua referência Namede instância, conforme definido por.Then, a handler on a Button within that StackPanel references the StackPanel through its instance reference buttonContainer as set by Name.

<StackPanel Name="buttonContainer">
  <Button Click="RemoveThis">Click to remove this button</Button>
</StackPanel>
void RemoveThis(object sender, RoutedEventArgs e)
{
    FrameworkElement fe = e.Source as FrameworkElement;
    if (buttonContainer.Children.Contains(fe))
    {
        buttonContainer.Children.Remove(fe);
    }
}
 Private Sub RemoveThis(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
     Dim fe As FrameworkElement = e.Source
     If (buttonContainer.Children.Contains(fe)) Then
         buttonContainer.Children.Remove(fe)
     End If
End Sub

Assim como uma variável, o nome XAML para uma instância é regido por um conceito do escopo, de modo que pode ser imposto que os nomes sejam exclusivos dentro de um determinado escopo previsível.Just like a variable, the XAML name for an instance is governed by a concept of scope, so that names can be enforced to be unique within a certain scope that is predictable. A marcação primária que define uma página denota um namescope XAML exclusivo, com o limite de namescopes XAML sendo o elemento raiz dessa página.The primary markup that defines a page denotes one unique XAML namescope, with the XAML namescope boundary being the root element of that page. No entanto, outras fontes de marcação como estilos ou modelos dentro de estilos podem interagir com uma página em tempo de execução e essas fontes de marcação geralmente têm seus próprios namescopes XAML, que não necessariamente conectam-se com o namescope XAML da página.However, other markup sources can interact with a page at run time, such as styles or templates within styles, and such markup sources often have their own XAML namescopes that do not necessarily connect with the XAML namescope of the page. Para obter mais informações x:Name e namescopes XAML, consulte Name, diretiva x:Nameou namescopes XAML do WPF.For more information on x:Name and XAML namescopes, see Name, x:Name Directive, or WPF XAML Namescopes.

Propriedades anexadas e eventos anexadosAttached properties and attached events

O XAML Especifica um recurso de linguagem que permite que determinadas propriedades ou eventos sejam especificados em qualquer elemento, independentemente de a propriedade ou evento existir nas definições do tipo para o elemento em que ele está sendo definido.XAML specifies a language feature that enables certain properties or events to be specified on any element, regardless of whether the property or event exists in the type's definitions for the element it is being set on. A versão de propriedades desse recurso é chamada de uma propriedade anexada, a versão de eventos é chamada de um evento anexado.The properties version of this feature is called an attached property, the events version is called an attached event. Conceitualmente, você pode pensar em propriedades anexadas e eventos anexados como membros globais que podem ser definidos em qualquer instância de objeto/elemento XAML.Conceptually, you can think of attached properties and attached events as global members that can be set on any XAML element/object instance. No entanto, esse elemento/classe ou uma infraestrutura maior deve dar suporte a um repositório de propriedades de suporte para os valores anexados.However, that element/class or a larger infrastructure must support a backing property store for the attached values.

Propriedades anexadas em XAML normalmente são usadas por meio da sintaxe de atributo.Attached properties in XAML are typically used through attribute syntax. Na sintaxe de atributo, você especifica uma propriedade anexada na forma ownerType.propertyName.In attribute syntax, you specify an attached property in the form ownerType.propertyName.

Superficialmente, isso é semelhante a um uso de elemento de propriedade; neste caso, no entanto, o ownerType que você especifica é sempre um tipo diferente do elemento de objeto em que a propriedade anexada está sendo definida.Superficially, this resembles a property element usage, but in this case the ownerType you specify is always a different type than the object element where the attached property is being set. ownerType é o tipo que fornece os métodos acessadores que são exigidos por um processador XAML para obter ou definir o valor da propriedade anexada.ownerType is the type that provides the accessor methods that are required by a XAML processor in order to get or set the attached property value.

O cenário mais comum para propriedades anexadas é habilitar que elementos filho relatem um valor da propriedade para o respectivo elemento pai.The most common scenario for attached properties is to enable child elements to report a property value to their parent element.

O exemplo a seguir ilustra DockPanel.Dock a propriedade anexada.The following example illustrates the DockPanel.Dock attached property. A DockPanel classe define os acessadores DockPanel.Dock para e, portanto, possui a propriedade anexada.The DockPanel class defines the accessors for DockPanel.Dock and therefore owns the attached property. A DockPanel classe também inclui uma lógica que itera seus elementos filho e verifica especificamente cada elemento em busca de um valor DockPanel.Dockdefinido de.The DockPanel class also includes logic that iterates its child elements and specifically checks each element for a set value of DockPanel.Dock. Se um valor for encontrado, esse valor será usado durante o layout para posicionar os elementos filho.If a value is found, that value is used during layout to position the child elements. O uso da DockPanel.Dock Propriedade anexada e esse recurso de posicionamento é, na verdade, o DockPanel cenário motivador para a classe.Use of the DockPanel.Dock attached property and this positioning capability is in fact the motivating scenario for the DockPanel class.

<DockPanel>
  <Button DockPanel.Dock="Left" Width="100" Height="20">I am on the left</Button>
  <Button DockPanel.Dock="Right" Width="100" Height="20">I am on the right</Button>
</DockPanel>

Em WPFWPF, a maioria ou todas as propriedades anexadas são implementadas como propriedades de dependência.In WPFWPF, most or all the attached properties are also implemented as dependency properties. Para obter detalhes, consulte Visão geral das propriedades anexadas.For details, see Attached Properties Overview.

Eventos anexados usam uma forma ownerType.eventName semelhante de sintaxe de atributo.Attached events use a similar ownerType.eventName form of attribute syntax. Assim como nos eventos não anexados, o valor do atributo para um evento anexado em XAML especifica o nome do método manipulador que é invocado quando o evento é manipulado no elemento.Just like the non-attached events, the attribute value for an attached event in XAML specifies the name of the handler method that is invoked when the event is handled on the element. Usos de evento anexado no XAML WPF são menos comuns.Attached event usages in WPF XAML are less common. Para obter mais informações, consulte Visão geral de eventos anexados.For more information, see Attached Events Overview.

Tipos base e XAMLBase types and XAML

O WPF XAML subjacente e seu namespace XAML é uma coleção de tipos que correspondem a objetos CLR, além de elementos de marcação para XAML.Underlying WPF XAML and its XAML namespace is a collection of types that correspond to CLR objects in addition to markup elements for XAML. No entanto, nem todas as classes podem ser mapeadas para elementos.However, not all classes can be mapped to elements. Classes abstratas, como ButtonBasee determinadas classes de base não abstratas, são usadas para herança no modelo de objetos CLR.Abstract classes, such as ButtonBase, and certain nonabstract base classes are used for inheritance in the CLR objects model. Classes base, incluindo aquelas abstratas, são importantes para o desenvolvimento de XAML, porque cada um dos elementos XAML concretos herda os membros de alguma classe base na sua hierarquia.Base classes, including abstract ones, are still important to XAML development because each of the concrete XAML elements inherits members from some base class in its hierarchy. Frequentemente esses membros incluem propriedades que podem ser definidas como atributos no elemento ou eventos que podem ser manipulados.Often these members include properties that can be set as attributes on the element, or events that can be handled. FrameworkElementé a classe base Interface de UsuárioUI concreta do WPFWPF no nível da estrutura do WPF.FrameworkElement is the concrete base Interface de UsuárioUI class of WPFWPF at the WPF framework level. Ao criar Interface de UsuárioUI, você usará várias classes de forma, painel, decorador ou controle, que derivam FrameworkElementde.When designing Interface de UsuárioUI, you will use various shape, panel, decorator, or control classes, which all derive from FrameworkElement. Uma classe base relacionada, FrameworkContentElement, oferece suporte a elementos orientados a documentos que funcionam bem para uma apresentação de layout de fluxo, usando APIs que FrameworkElementespelham as APIs deliberadamente.A related base class, FrameworkContentElement, supports document-oriented elements that work well for a flow layout presentation, using APIs that deliberately mirror the APIs in FrameworkElement. A combinação de atributos no nível de elemento e um modelo de objeto CLR fornece um conjunto de propriedades comuns que são configuráveis na maioria dos elementos XAML concretos, independentemente do elemento XAML específico e seu tipo subjacente.The combination of attributes at the element level and a CLR object model provides you with a set of common properties that are settable on most concrete XAML elements, regardless of the specific XAML element and its underlying type.

Segurança XAMLXAML security

XAML é uma linguagem de marcação que representa diretamente a instanciação e execução de objetos.XAML is a markup language that directly represents object instantiation and execution. Portanto, elementos criados em XAML têm a mesma capacidade que o código gerado equivalente no que se refere a interagir com recursos de sistema (acesso a rede e E/S do sistema de arquivos, por exemplo).Therefore, elements created in XAML have the same ability to interact with system resources (network access, file system IO, for example) as the equivalent generated code does.

WPFWPFdá suporte à .NET Framework 4 CAS (segurança de acesso ao código) da estrutura de segurança.supports the .NET Framework 4 security framework Code Access Security (CAS). Isso significa que conteúdo do WPFWPF em execução na zona da Internet tem permissões de execução reduzidas.This means that WPFWPF content running in the internet zone has reduced execution permissions. "XAML avulso" (páginas de XAML não compilado interpretado na hora do carregamento por um visualizador XAML) e XBAP (aplicativo de navegação XAML)XAML browser application (XBAP) geralmente são executados nesta zona da Internet e usam o mesmo conjunto de permissões."Loose XAML" (pages of noncompiled XAML interpreted at load time by a XAML viewer) and XBAP (aplicativo de navegação XAML)XAML browser application (XBAP) are usually run in this internet zone and use the same permission set. No entanto, o XAML carregado em um aplicativo totalmente confiável tem o mesmo acesso aos recursos de sistema que o aplicativo host.However, XAML loaded in to a fully trusted application has the same access to the system resources as the hosting application does. Para obter mais informações, consulte Segurança parcialmente confiável do WPF.For more information, see WPF Partial Trust Security.

Carregando XAML do códigoLoading XAML from code

XAML pode ser usado para definir toda a interface do usuário, mas às vezes também é apropriado definir apenas uma parte da interface do usuário em XAML.XAML can be used to define all of the UI, but it is sometimes also appropriate to define just a piece of the UI in XAML. Essa funcionalidade pode ser usada para habilitar personalização parcial, armazenamento local de informações, uso do XAML para fornecer um objeto comercial ou uma variedade de cenários possíveis.This capability could be used to enable partial customization, local storage of information, using XAML to provide a business object, or a variety of possible scenarios. A chave para esses cenários é a XamlReader classe e seu Load método.The key to these scenarios is the XamlReader class and its Load method. A entrada é um arquivo XAML e a saída é um objeto que representa toda a árvore de objetos em tempo de execução que foi criada com base nessa marcação.The input is a XAML file, and the output is an object that represents all of the run-time tree of objects that was created from that markup. Em seguida, você pode inserir o objeto para ser uma propriedade de outro objeto que já existe no aplicativo.You then can insert the object to be a property of another object that already exists in the application. Desde que a propriedade seja uma propriedade adequada no modelo de conteúdo que tem recursos de exibição e que notificará o mecanismo de execução de que novo conteúdo foi adicionado no aplicativo, você poderá modificar o conteúdo de um aplicativo em execução facilmente carregando em XAML.So long as the property is an appropriate property in the content model that has eventual display capabilities and that will notify the execution engine that new content has been added into the application, you can modify a running application's contents very easily by loading in XAML. Observe que essa funcionalidade geralmente só está disponível em aplicativos de confiança total, devido às implicações de segurança óbvias de carregar arquivos em aplicativos enquanto estes são executados.Note that this capability is generally only available in full-trust applications, because of the obvious security implications of loading files into applications as they run.

O que vem a seguirWhat's next

Este tópico fornece uma introdução básica a conceitos de sintaxe XAML e terminologia como ela se aplica ao WPF.This topic provides a basic introduction to XAML syntax concepts and terminology as it applies to WPF. Para obter mais informações sobre os termos usados aqui, consulte Sintaxe XAML em detalhes.For more information about the terms used here, see XAML Syntax In Detail.

Se você ainda não tiver feito isso, experimente o passo a passos no tópico do tutorial: Meu primeiro aplicativode área de trabalho do WPF.If you have not already done this, try the exercises in the tutorial topic Walkthrough: My first WPF desktop application. Quando você criar o aplicativo centrado em marcação descrito pelo tutorial, o exercício ajudará a reforçar muitos dos conceitos descritos neste tópico.When you create the markup-centric application described by the tutorial, the exercise will help reinforce many of the concepts described in this topic.

WPFWPFusa um modelo de aplicativo específico baseado na Application classe.uses a particular application model that is based on the Application class. Para obter detalhes, consulte Visão geral do gerenciamento de aplicativo.For details, see Application Management Overview.

Criando um aplicativo WPF fornece mais detalhes sobre como criar aplicativos que incluem XAML da linha de comando e com Microsoft Visual StudioMicrosoft Visual Studio.Building a WPF Application gives you more details about how to build XAML inclusive applications from the command line and with Microsoft Visual StudioMicrosoft Visual Studio.

Visão geral das propriedades de dependência fornece mais informações sobre a versatilidade das propriedades no WPFWPF e apresenta o conceito de propriedades de dependência.Dependency Properties Overview gives more information about the versatility of properties in WPFWPF, and introduces the concept of dependency properties.

Consulte tambémSee also