Información general XAML (WPF)XAML overview (WPF)

En este tema se describen las características del lenguaje XAML y se muestra cómo usar XAML para escribir aplicaciones 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. En este tema se describe el código XAML específicamente tal y como lo implementa WPFWPF.This topic specifically describes XAML as implemented by WPFWPF. El propio código XAML es un concepto de lenguaje más amplio que WPFWPF.XAML itself is a larger language concept than WPFWPF.

¿Qué es XAML?What is XAML?

XAML es un lenguaje declarativo de marcado.XAML is a declarative markup language. A medida que se aplican al modelo de programación de .NET Framework, XAML simplifica la creación de un IUUI para una aplicación de .NET Framework.As applied to the .NET Framework programming model, XAML simplifies creating a IUUI for a .NET Framework application. Se pueden crear elementos visibles de la IUUI en el marcado XAML declarativo y, después, separar la definición de la IUUI de la lógica en tiempo de ejecución mediante archivos de código subyacente, que se unen al marcado mediante definiciones de clases parciales.You can create visible IUUI elements in the declarative XAML markup, and then separate the IUUI definition from the run-time logic by using code-behind files, joined to the markup through partial class definitions. XAML representa directamente la creación de instancias de objetos en un conjunto concreto de tipos de respaldo definidos en ensamblados.XAML directly represents the instantiation of objects in a specific set of backing types defined in assemblies. Esto no es lo que sucede con la mayoría de lenguajes de marcado, que normalmente se interpretan sin esa relación directa con un sistema de tipos de respaldo.This is unlike most other markup languages, which are typically an interpreted language without such a direct tie to a backing type system. El código XAML habilita un flujo de trabajo en el que las partes independientes pueden funcionar en la IUUI y la lógica de una aplicación, a través de herramientas potencialmente diferentes.XAML enables a workflow where separate parties can work on the IUUI and the logic of an application, using potentially different tools.

Cuando se representan como texto, los archivos XAML son archivos XML que generalmente tienen la extensión .xaml.When represented as text, XAML files are XML files that generally have the .xaml extension. Los archivos se pueden codificar con cualquier codificación XML, pero lo habitual es la codificación UTF-8.The files can be encoded by any XML encoding, but encoding as UTF-8 is typical.

En el ejemplo siguiente se muestra cómo podría crear un botón como parte de una IUUI.The following example shows how you might create a button as part of a IUUI. Este ejemplo se ha pensado simplemente para que tenga una idea de cómo representa el código XAML las metáforas de programación de la IUUI común (no es un ejemplo completo).This example is just intended to give you a flavor of how XAML represents common IUUI programming metaphors (it is not a complete sample).

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

Resumen de sintaxis XAMLXAML syntax in brief

En las secciones siguientes se explican las formas básicas de la sintaxis XAML y se proporciona un breve ejemplo de marcado.The following sections explain the basic forms of XAML syntax, and give a short markup example. Estas secciones no están pensadas para proporcionar información completa sobre cada sintaxis, por ejemplo, cómo se representan en el sistema de tipos de respaldo.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 obtener más información sobre los detalles específicos de la sintaxis de XAML para cada una de las formas de sintaxis presentadas en este tema, vea Detalles de la sintaxis XAML.For more information about the specifics of XAML syntax for each of the syntax forms introduced in this topic, see XAML Syntax In Detail.

Gran parte del material de las secciones siguientes será básico para usted si está familiarizado con el lenguaje XML.Much of the material in the next few sections will be elementary to you, if you have previous familiarity with the XML language. Esta es una consecuencia de uno de los principios de diseño básicos de XAML.This is a consequence of one of the basic design principles of XAML. El lenguaje XAML define conceptos propios, pero estos conceptos funcionan dentro del formulario de lenguaje y marcado XML.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, un elemento de objeto declara una instancia de un tipo.An object element typically declares an instance of a type. Ese tipo se define en los ensamblados que proporcionan los tipos de respaldo para una tecnología que usa XAML como un lenguaje.That type is defined in the assemblies that provide the backing types for a technology that uses XAML as a language.

La sintaxis del elemento de objeto siempre se inicia con un corchete angular de apertura (<).Object element syntax always starts with an opening angle bracket (<). Este va seguido del nombre del tipo donde quiere crear una instancia.This is followed by the name of the type where you want to create an instance. (El nombre puede incluir un prefijo, un concepto que se explicará más adelante). Después de esto, puede declarar opcionalmente los atributos en el elemento de 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 completar la etiqueta del elemento de objeto, finalice con un corchete angular de cierre (>).To complete the object element tag, end with a closing angle bracket (>). Opcionalmente, puede usar un formulario de autocierre que no tenga contenido y completar la etiqueta con una barra diagonal y un corchete angular de cierre (/>) seguidos.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 ejemplo, examine de nuevo el fragmento de código de marcado que se ha mostrado anteriormente:For example, look at the previously shown markup snippet again:

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

Esto especifica dos elementos de objeto: <StackPanel> (con contenido y una etiqueta de cierre después) y <Button .../> (el formulario de autocierre, con varios atributos).This specifies two object elements: <StackPanel> (with content, and a closing tag later), and <Button .../> (the self-closing form, with several attributes). Los elementos de objeto StackPanel y Button se asignan al nombre de una clase definida por WPFWPF y que forma parte de los ensamblados de 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. Al especificar una etiqueta de elemento de objeto, crea una instrucción para que el procesamiento XAML cree una nueva instancia.When you specify an object element tag, you create an instruction for XAML processing to create a new instance. Cada instancia se crea llamando al constructor predeterminado del tipo subyacente al analizar y cargar el código XAML.Each instance is created by calling the default constructor of the underlying type when parsing and loading the XAML.

Sintaxis de atributos (propiedades)Attribute syntax (properties)

Las propiedades de un objeto se pueden expresar a menudo como atributos del elemento de objeto.Properties of an object can often be expressed as attributes of the object element. Una sintaxis de atributo denomina la propiedad que está estableciendo en la sintaxis de atributo, seguida del operador de asignación (=).An attribute syntax names the property that is being set in attribute syntax, followed by the assignment operator (=). El valor de un atributo siempre se especifica como una cadena incluida entre comillas.The value of an attribute is always specified as a string that is contained within quotation marks.

La sintaxis de atributo es la sintaxis de establecimiento de propiedades más optimizada y será la más intuitiva para los desarrolladores que han usado lenguajes de marcado 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 ejemplo, el marcado siguiente crea un botón que tiene texto rojo y un fondo azul, además de mostrar texto 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"/>

Sintaxis de elemento de propiedadProperty element syntax

En algunas propiedades de un elemento de objeto, no es posible usar la sintaxis de atributo, ya que el objeto o la información necesaria para proporcionar el valor de propiedad no se puede expresar correctamente dentro de las comillas y restricciones de cadena de la sintaxis 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. En estos casos, se puede usar otra sintaxis conocida como sintaxis de elementos de propiedad.For these cases, a different syntax known as property element syntax can be used.

La sintaxis de la etiqueta inicial del elemento de propiedad es <nombreDeTipo.nombreDePropiedad>.The syntax for the property element start tag is <typeName.propertyName>. Generalmente, el contenido de la etiqueta es un elemento de objeto del tipo que la propiedad toma como su valor.Generally, the content of that tag is an object element of the type that the property takes as its value . Después de especificar el contenido, debe cerrar el elemento de propiedad con una etiqueta de cierre.After specifying content, you must close the property element with an end tag. La sintaxis de la etiqueta de cierre es </nombreTipo.nombrePropiedad>.The syntax for the end tag is </typeName.propertyName>.

Si es posible usar una sintaxis de atributo, su uso es generalmente más conveniente, ya que habilita un marcado más compacto, pero suele ser una cuestión de estilo, no una limitación 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. En el ejemplo siguiente se muestra cómo se establecen las mismas propiedades que en el ejemplo anterior de sintaxis de atributo, pero ahora usando la sintaxis de elementos de propiedad para todas las propiedades de 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>

Sintaxis de colecciónCollection syntax

El lenguaje XAML incluye algunas optimizaciones que generan un marcado más legible.The XAML language includes some optimizations that produce more human-readable markup. Una de estas optimizaciones consiste en que si una propiedad determinada toma un tipo de colección, entonces los elementos que se declaran en el marcado como elementos secundarios dentro del valor de esa propiedad se convierten en parte de la colección.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. En este caso, una colección de elementos de objeto secundarios es el valor que se establece para la propiedad de la colección.In this case a collection of child object elements is the value being set to the collection property.

El ejemplo siguiente muestra la sintaxis de colección para establecer valores de la GradientStops propiedad: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>  

Propiedades de contenido XAMLXAML content properties

XAML especifica una característica del lenguaje por la que una clase puede designar exactamente una de sus propiedades para que sea la propiedad de contenido de XAML.XAML specifies a language feature whereby a class can designate exactly one of its properties to be the XAML content property. Los elementos secundarios de ese elemento de objeto se usan para establecer el valor de esa propiedad de contenido.Child elements of that object element are used to set the value of that content property. Es decir, únicamente para la propiedad de contenido, puede omitir un elemento de propiedad cuando se establece esa propiedad en marcado XAML y genera una metáfora de elemento primario/secundario más visible en el marcado.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 ejemplo, Border especifica una propiedad de contenido de Child.For example, Border specifies a content property of Child. Las dos siguientes Border elementos se tratan de forma idéntica.The following two Border elements are treated identically. El primero se aprovecha de la sintaxis de la propiedad de contenido y omite el elemento de propiedad Border.Child.The first one takes advantage of the content property syntax and omits the Border.Child property element. El segundo muestra Border.Child explícitamente.The second one shows Border.Child explicitly.

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

Como regla del lenguaje XAML, el valor de una propiedad de contenido de XAML se debe proporcionar exclusivamente antes o después de cualquier otro elemento de propiedad en ese 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 ejemplo, el marcado siguiente no se puede compilar:For instance, the following markup does not compile:

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

Para obtener más información sobre esta restricción en las propiedades de contenido de XAML, vea la sección "Propiedades del contenido XAML" de Detalles de la sintaxis XAML.For more information about this restriction on XAML content properties, see the "XAML Content Properties" section of XAML Syntax In Detail.

Contenido de textoText content

Un pequeño número de elementos de código XAML puede procesar directamente el texto como su contenido.A small number of XAML elements can directly process text as their content. Para habilitar esto, debe cumplirse una de estas situaciones:To enable this, one of the following cases must be true:

  • La clase debe declarar una propiedad de contenido y esa propiedad de contenido debe ser de un tipo asignable a una cadena (el tipo podría ser Object).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 ejemplo, cualquier ContentControl usa Content como su propiedad de contenido y es tipo Object, y esto es compatible con el siguiente uso en un práctico ContentControl como un Button: <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>.

  • El tipo debe declarar un convertidor de tipos, en cuyo caso el contenido de texto se usa como texto de inicialización para ese convertidor de tipos.The type must declare a type converter, in which case the text content is used as initialization text for that type converter. Por ejemplo: <Brush>Blue</Brush>.For example, <Brush>Blue</Brush>. Este caso es menos común en la práctica.This case is less common in practice.

  • El tipo debe ser una primitiva conocida del lenguaje XAML.The type must be a known XAML language primitive.

Sintaxis de las propiedades y colección contenido combinadoContent properties and collection syntax combined

Considere este ejemplo:Consider this example:

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

En este caso, cada Button es un elemento secundario de StackPanel.Here, each Button is a child element of StackPanel. Este es un marcado optimizado e intuitivo que omite dos etiquetas por dos razones diferentes.This is a streamlined and intuitive markup that omits two tags for two different reasons.

  • Elemento de propiedad StackPanel.Children omitido: StackPanel deriva Panel.Omitted StackPanel.Children property element: StackPanel derives from Panel. Panel define Panel.Children como su XAML propiedad de contenido.Panel defines Panel.Children as its XAML content property.

  • Elemento de objeto UIElementCollection omitido: el Panel.Children propiedad toma el tipo UIElementCollection, que implementa IList.Omitted UIElementCollection object element: The Panel.Children property takes the type UIElementCollection, which implements IList. Se puede omitir una etiqueta de elemento de la colección, basándose en las reglas XAML para procesar colecciones como IList.The collection's element tag can be omitted, based on the XAML rules for processing collections such as IList. (En este caso, UIElementCollection realmente no pueden crearse instancias porque no expone un constructor predeterminado y, por eso la UIElementCollection elemento de objeto se muestra marcado como comentario).(In this case, UIElementCollection actually cannot be instantiated because it does not expose a default 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>  

Sintaxis de atributo (eventos)Attribute syntax (events)

La sintaxis de atributos también se puede usar para los miembros que son eventos en lugar de propiedades.Attribute syntax can also be used for members that are events rather than properties. En este caso, el nombre del atributo es el nombre del evento.In this case, the attribute's name is the name of the event. En la implementación WPF de eventos para XAML, el valor del atributo es el nombre de un controlador que implementa el delegado de ese 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 ejemplo, el marcado siguiente asigna un controlador para el Click eventos a un Button creado en el marcado: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>

En WPF, los eventos y el código XAML son más complejos que este ejemplo de la sintaxis de atributos.There is more to events and XAML in WPF than just this example of the attribute syntax. Por ejemplo, podría preguntarse qué representa el elemento ClickHandler al que se hace referencia aquí y cómo se define.For example, you might wonder what the ClickHandler referenced here represents and how it is defined. Esto se explicará en la próxima sección Eventos y el código XAML subyacente de este tema.This will be explained in the upcoming Events and XAML Code-Behind section of this topic.

Caso y espacio en blanco en XAMLCase and white space in XAML

En general, XAML distingue entre mayúsculas y minúsculas.XAML is generally speaking case sensitive. Para fines de resolver los tipos de respaldo, el XAML de WPF distingue entre mayúsculas y minúsculas por las mismas reglas que el CLR.For purposes of resolving backing types, WPF XAML is case sensitive by the same rules that the CLR is case sensitive. Los elementos de objeto, los elementos de propiedad y los nombres de atributo se deben especificar usando la grafía que distinga mayúsculas de minúsculas cuando se comparan por nombre con el tipo subyacente en el ensamblado, o con un miembro de un 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. Las palabras clave y primitivas del lenguaje XAML también distinguen entre mayúsculas y minúsculas.XAML language keywords and primitives are also case sensitive. Los valores no siempre distinguen entre mayúsculas y minúsculas.Values are not always case sensitive. La distinción entre mayúsculas y minúsculas para los valores dependerá del comportamiento del convertidor de tipos asociado a la propiedad que toma el valor o del tipo de valor de propiedad.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 ejemplo, las propiedades que toman el Boolean tipo puede tener cualquiera true o True como valores equivalentes, pero solo porque el analizador de WPF XAML nativo tipo de conversión de cadena a Boolean ya los permite 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.

WPF XAML procesadores y serializadores omitirá o quitar espacio en blanco no significativos todo y le normalizan cualquier espacio en blanco significativo.WPF XAML processors and serializers will ignore or drop all nonsignificant white space, and will normalize any significant white space. Esto es coherente con las recomendaciones de comportamiento de espacio en blanco predeterminado de la especificación de XAML.This is consistent with the default white-space behavior recommendations of the XAML specification. Este comportamiento generalmente solo tiene importancia si se especifican cadenas dentro de las propiedades de contenido de XAML.This behavior is generally only of consequence when you specify strings within XAML content properties. Es decir, XAML convierte los caracteres de espacio, avance de línea y tabulación en espacios y, después, conserva un espacio si lo encuentra en cualquier extremo de una cadena contigua.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. La explicación completa del control de espacio en blanco XAML no se trata en este tema.The full explanation of XAML white-space handling is not covered in this topic. Para obtener más información, consulte espacio en blanco en XAML de procesamiento.For details, see White space processing in XAML.

Extensiones de marcadoMarkup extensions

Las extensiones de marcado son un concepto del lenguaje XAML.Markup extensions are a XAML language concept. Cuando se usan para proporcionar el valor de una sintaxis de atributos, las llaves ({ y }) indican el uso de una extensión de marcado.When used to provide the value of an attribute syntax, curly braces ({ and }) indicate a markup extension usage. Este uso hace que el procesamiento XAML se aparte del tratamiento general de valores de atributo como una cadena literal o un valor directamente convertible en cadena.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.

Las extensiones de marcado más comunes usadas en la programación de aplicaciones de WPFWPF son Binding, usadas para las expresiones de enlace de datos, y las referencias de recursos StaticResource y 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. Al usar las extensiones de marcado, puede usar la sintaxis de atributos para proporcionar valores para las propiedades aunque esa propiedad no admita una sintaxis de atributos en general.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. Las extensiones de marcado usan a menudo tipos de expresión intermedia para habilitar características tales como diferir los valores o hacer referencia a otros objetos que solo están presentes en tiempo de ejecución.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 ejemplo, el siguiente marcado establece el valor de la Style propiedad mediante la sintaxis de atributo.For example, the following markup sets the value of the Style property using attribute syntax. El Style propiedad toma una instancia de la Style (clase), que no se pueden crear instancias mediante una cadena de sintaxis de atributo de forma predeterminada.The Style property takes an instance of the Style class, which by default could not be instantiated by an attribute syntax string. Pero en este caso, el atributo hace referencia a una extensión de marcado determinada, StaticResource.But in this case, the attribute references a particular markup extension, StaticResource. Cuando se procesa dicha extensión de marcado, devuelve una referencia a un estilo del que ya se han creado instancias como un recurso con clave en un diccionario 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 obtener una lista de referencias de todas las extensiones de marcado para XAML implementadas específicamente en WPF, vea Extensiones XAML de WPF.For a reference listing of all markup extensions for XAML implemented specifically in WPF, see WPF XAML Extensions. Para obtener una lista de referencias de las extensiones de marcado definidas por System.Xaml y que están más disponibles para las implementaciones XAML de .NET Framework, vea Características de lenguaje (x:) de espacios de nombres XAML.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 obtener más información sobre los conceptos de la extensión de marcado, vea Extensiones de marcado y XAML de WPF.For more information about markup extension concepts, see Markup Extensions and WPF XAML.

Convertidores de tiposType converters

En la sección Resumen de sintaxis de XAML, se ha mencionado que el valor de atributo debe poder establecerlo una cadena.In the XAML Syntax in Brief section, it was stated that the attribute value must be able to be set by a string. El control nativo básico de cómo se convierten cadenas en otros tipos de objetos o valores primitivos se basa en el String propio tipo, procesamiento además a código nativo para ciertos tipos como DateTime o 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. Pero muchos tipos o miembros de WPFWPF de esos tipos extienden el comportamiento básico del procesamiento de atributos de cadena, de tal forma que se pueden especificar instancias de tipos de objeto más complejos como cadenas y 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.

El Thickness estructura es un ejemplo de un tipo que tiene una conversión de tipos habilitada para los usos de XAML.The Thickness structure is an example of a type that has a type conversion enabled for XAML usages. Thickness indica las medidas dentro de un rectángulo anidado y se usa como el valor para las propiedades como Margin.Thickness indicates measurements within a nested rectangle and is used as the value for properties such as Margin. Al colocar un convertidor de tipos en Thickness, todas las propiedades que usan un Thickness son más fáciles de especificar en XAML porque se pueden especificar 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. En el ejemplo siguiente se usa una sintaxis de conversión y el atributo de tipo para proporcionar un valor para un Margin: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"/>

El ejemplo de sintaxis de atributo anterior es equivalente al siguiente ejemplo de sintaxis más detallado, donde el Margin se establece mediante la sintaxis de elemento de propiedad que contiene un Thickness elemento de objeto.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. Propiedades de clave de los cuatro Thickness se establecen como atributos en la nueva instancia: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>

Nota

También hay un número limitado de objetos en los que la conversión de tipos es la única manera pública de establecer una propiedad en ese tipo sin necesidad de una subclase, debido a que el propio objeto de tipo no tiene un constructor predeterminado.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 default constructor. Un ejemplo es Cursor.An example is Cursor.

Para obtener más información sobre la compatibilidad de la conversión de tipos y su uso para la sintaxis de atributos, vea Clases TypeConverter y XAML.For more information on how type conversion and its use for attribute syntax is supported, see TypeConverters and XAML.

Los elementos raíz XAML y espacios de nombres XAMLXAML root elements and XAML namespaces

Para que un archivo XAML pueda ser tanto un archivo XMLXML con un formato correcto como un archivo XAML válido, solo debe tener un elemento raíz.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 los escenarios típicos de WPF, usa un elemento raíz que tiene un significado destacado en el modelo de aplicación de WPF (por ejemplo, Window o Page para una página, ResourceDictionary para un diccionario externo, o Application para la definición de aplicación).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). El ejemplo siguiente muestra el elemento raíz de un archivo XAML típico para un WPFWPF página con el elemento raíz de Page.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>

El elemento raíz también contiene los atributos xmlns y xmlns:x.The root element also contains the attributes xmlns and xmlns:x. Estos atributos indican a un procesador XAML los espacios de nombres XAML que contienen las definiciones de tipo de los tipos de respaldo a los que el marcado hará referencia 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. El atributo xmlns indica específicamente el espacio de nombres XAML predeterminado.The xmlns attribute specifically indicates the default XAML namespace. Dentro del espacio de nombres XAML predeterminado, los elementos de objeto en el marcado se pueden especificar sin un prefijo.Within the default XAML namespace, object elements in the markup can be specified without a prefix. Para la mayoría de los escenarios de aplicaciones WPFWPF y para casi todos los ejemplos que se proporcionan en las secciones de WPFWPF del SDKSDK, el espacio de nombres XAML predeterminado está asignado al espacio de nombres http://schemas.microsoft.com/winfx/2006/xaml/presentationhttp://schemas.microsoft.com/winfx/2006/xaml/presentation de 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/presentationhttp://schemas.microsoft.com/winfx/2006/xaml/presentation. El atributo xmlns:x indica un espacio de nombres XAML adicional, que asigna el espacio de nombres del lenguaje XAML http://schemas.microsoft.com/winfx/2006/xamlhttp://schemas.microsoft.com/winfx/2006/xaml.The xmlns:x attribute indicates an additional XAML namespace, which maps the XAML language namespace http://schemas.microsoft.com/winfx/2006/xamlhttp://schemas.microsoft.com/winfx/2006/xaml.

Este uso de xmlns para definir un ámbito para el uso y asignación de un ámbito de nombres es coherente con la especificación 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. Los ámbitos de nombres de código XAML solo se diferencian de los ámbitos de nombres de XML en que un ámbito de nombres de código XAML también implica a la forma en que los tipos respaldan los elementos del ámbito de nombres cuando se trata de la resolución de tipos y del análisis del código 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 los atributos xmlns solo son estrictamente necesarios en el elemento raíz de cada archivo XAML.Note that the xmlns attributes are only strictly necessary on the root element of each XAML file. Las definiciones de xmlns se aplicarán a todos los elementos descendientes del elemento raíz (una vez más, este comportamiento es coherente con la especificación XML 1.0 para xmlns). También se permiten atributos xmlns en otros elementos bajo la raíz, y se aplican a cualquier elemento descendiente del elemento de definición.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. En cambio, una definición o redefinición frecuente de los espacios de nombres XAML puede dar lugar a un estilo de marcado XAML que resulte difícil de leer.However, frequent definition or redefinition of XAML namespaces can result in a XAML markup style that is difficult to read.

La implementación de WPFWPF de su procesador XAML incluye una infraestructura que reconoce los ensamblados básicos de WPF.The WPFWPF implementation of its XAML processor includes an infrastructure that has awareness of the WPF core assemblies. Se sabe que los ensamblados básicos de WPFWPF contienen los tipos que admiten las asignaciones de WPFWPF al espacio de nombres XAML predeterminado.The WPFWPF core assemblies are known to contain the types that support the WPFWPF mappings to the default XAML namespace. Esto se habilita a través de la configuración que forma parte de su archivo de compilación de proyecto y los sistemas de compilación y proyectos de WPF.This is enabled through configuration that is part of your project build file and the WPF build and project systems. Por consiguiente, solo es necesario declarar el espacio de nombres XAML predeterminado como xmlns predeterminado para hacer referencia a los elementos de código XAML que proceden de los ensamblados de 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.

El prefijo x:The x: prefix

En el ejemplo de elemento raíz anterior, el prefijo x: se ha usado para asignar el espacio de nombres XAML http://schemas.microsoft.com/winfx/2006/xamlhttp://schemas.microsoft.com/winfx/2006/xaml, que es el espacio de nombres XAML dedicado que admite las construcciones de lenguaje XAML.In the previous root element example, the prefix x: was used to map the XAML namespace http://schemas.microsoft.com/winfx/2006/xamlhttp://schemas.microsoft.com/winfx/2006/xaml, which is the dedicated XAML namespace that supports XAML language constructs. Este prefijo x: se usa para asignar el espacio de nombres XAML en las plantillas de los proyectos, en los ejemplos y en la documentación de 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. El espacio de nombres XAML para el lenguaje XAML contiene varias construcciones de programación que usará con mucha frecuencia en el código XAML.The XAML namespace for the XAML language contain several programming constructs that you will use very frequently in your XAML. A continuación se muestra una lista de las construcciones de programación del prefijo x: más comunes que usará:The following is a listing of the most common x: prefix programming constructs you will use:

  • x: Key: establece una clave única para cada recurso en un ResourceDictionary (o conceptos de diccionario similares en otros marcos).x:Key: Sets a unique key for each resource in a ResourceDictionary (or similar dictionary concepts in other frameworks). Probablemente x:Key representará el 90 % de los usos de x: que verá en un marcado de aplicación WPF típica.x:Key will probably account for 90% of the x: usages you will see in a typical WPF application's markup.

  • x:Class: especifica el espacio de nombres de CLRCLR y el nombre de la clase que proporciona código subyacente para una página XAML.x:Class: Specifies the CLRCLR namespace and class name for the class that provides code-behind for a XAML page. Debe disponer de esta clase para admitir el código subyacente por el modelo de programación WPF; por esto casi siempre verá x: asignado, aunque no haya ningún recurso.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 un nombre de objeto en tiempo de ejecución para la instancia que existe en el código en tiempo de ejecución una vez procesado un elemento de objeto.x:Name: Specifies a run-time object name for the instance that exists in run-time code after an object element is processed. En general, usará frecuentemente una propiedad equivalente definida por WPF para x:Name.In general, you will frequently use a WPF-defined equivalent property for x:Name. Tales propiedades se asignan específicamente a una propiedad de respaldo de CLR y así son más útiles para la programación de aplicaciones, donde frecuentemente se usa código del tiempo de ejecución para encontrar los elementos con nombre de 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. La más común de esas propiedades es FrameworkElement.Name.The most common such property is FrameworkElement.Name. Todavía podría usar x: Name cuando el marco WPF equivalente-nivel Name propiedad no se admite en un tipo determinado.You might still use x:Name when the equivalent WPF framework-level Name property is not supported in a particular type. Esto sucede en ciertos escenarios de animación.This occurs in certain animation scenarios.

  • x:Static: habilita una referencia que obtiene un valor estático que, de lo contrario, no sería una propiedad compatible con XAML.x:Static: Enables a reference that returns a static value that is not otherwise a XAML-compatible property.

  • x: Type: construye una Type referencia basada en un nombre de tipo.x:Type: Constructs a Type reference based on a type name. Esto se utiliza para especificar atributos que toman Type, tales como Style.TargetType, aunque con frecuencia la propiedad tiene la cadena nativa-a-Type conversión de manera que el x: Type es el uso de la extensión de marcado 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.

Hay construcciones de programación adicionales en el prefijo o espacio de nombres XAML x: que no son tan habituales.There are additional programming constructs in the x: prefix/XAML namespace, which are not as common. Para obtener información detallada, vea Características de lenguaje (x:) de espacios de nombres XAML.For details, see XAML Namespace (x:) Language Features.

Prefijos personalizados y tipos personalizados en XAMLCustom prefixes and custom types in XAML

Para sus propios ensamblados personalizados o para los ensamblados fuera del núcleo WPF de PresentationCore, PresentationFramework y WindowsBase, puede especificar el ensamblado como parte de una asignación xmlns personalizada.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. Después, puede hacer referencia a los tipos de ese ensamblado en su código XAML, siempre que su tipo esté implementado correctamente para admitir los usos de código XAML que intenta.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.

El siguiente es un ejemplo muy básico de cómo funcionan los prefijos personalizados en el marcado XAML.The following is a very basic example of how custom prefixes work in XAML markup. El prefijo custom se define en la etiqueta de elemento raíz y se asigna a un ensamblado concreto que se empaqueta y está disponible con la aplicación.The prefix custom is defined in the root element tag, and mapped to a specific assembly that is packaged and available with the application. Este ensamblado contiene un tipo NumericUpDown, que se implementa para admitir el uso XAML general, además de usar una herencia de clases que permite su inserción en este punto concreto en un modelo de contenido de código XAML de 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. Se declara una instancia de este control NumericUpDown como un elemento de objeto, usando el prefijo para que un analizador de código XAML sepa qué espacio de nombres XAML contiene el tipo y, por consiguiente, dónde está el ensamblado de respaldo que contiene la definición 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 obtener más información sobre los tipos personalizados en el código XAML, vea Clases XAML y personalizadas para WPF.For more information about custom types in XAML, see XAML and Custom Classes for WPF.

Para obtener más información sobre la relación existente entre los espacios de nombres XML y los espacios de nombres del código de respaldo en los ensamblados, vea Espacios de nombres y asignación de espacios de nombres XAML para 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 y el código XAML subyacenteEvents and XAML code-behind

La mayoría de las aplicaciones de WPFWPF constan de marcado XAML y código subyacente.Most WPFWPF applications consist of both XAML markup and code-behind. Dentro de un proyecto, el XAML se escribe como un .xaml archivo y un CLRCLR lenguaje, como Microsoft Visual Basic o C# se utiliza para escribir un archivo de código subyacente.Within a project, the XAML is written as a .xaml file, and a CLRCLR language such as Microsoft Visual Basic or C# is used to write a code-behind file. Cuando se compila un archivo XAML como parte de los modelos de aplicaciones y programación de WPF, la ubicación del archivo de código subyacente XAML para cada archivo XAML se identifica especificando un espacio de nombres y una clase como el atributo x:Class del elemento raíz de 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.

En los ejemplos presentados hasta ahora se incluían varios botones, pero ninguno de ellos tenía todavía ningún comportamiento lógico asociado.In the examples so far, you have seen several buttons, but none of these buttons had any logical behavior associated with them yet. El mecanismo primario en el nivel de la aplicación para agregar un comportamiento a un elemento de objeto consiste en usar un evento existente de la clase de elemento y escribir un controlador específico para dicho evento que se invocará cuando se genere este en tiempo de ejecución.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. El nombre del evento y el nombre del controlador que se van a usar se especifican en el marcado, mientras que el código que implementa el controlador se define en el código subyacente.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

Tenga en cuenta que el archivo de código subyacente usa el espacio de nombres CLR ExampleNamespace y declara ExamplePage como una clase parcial dentro de dicho espacio de nombres.Notice that the code-behind file uses the CLR namespace ExampleNamespace and declares ExamplePage as a partial class within that namespace. Esto es similar al valor de atributo x:Class de ExampleNamespace.ExamplePageThis parallels the x:Class attribute value of ExampleNamespace.ExamplePage que se ha proporcionado en la raíz del marcado.that was provided in the markup root. El compilador de marcado WPF creará una clase parcial para cualquier archivo XAML compilado, al derivar una clase del tipo de elemento raíz.The WPF markup compiler will create a partial class for any compiled XAML file, by deriving a class from the root element type. Al proporcionar código subyacente que también define la misma clase parcial, el código resultante se combina dentro del mismo espacio de nombres y la clase de la aplicación compilada.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 obtener más información sobre los requisitos para la programación de código subyacente en WPF, vea la sección "Requisitos del código subyacente, los controladores de eventos y las clases parciales" de Código subyacente y XAML en 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.

Si no quiere crear un archivo de código subyacente independiente, también puede insertar el código dentro de un archivo XAML.If you do not want to create a separate code-behind file, you can also inline your code in a XAML file. En cambio, el código insertado es una técnica menos versátil que tiene importantes limitaciones.However, inline code is a less versatile technique that has substantial limitations. Para obtener información detallada, vea Código subyacente y XAML en WPF.For details, see Code-Behind and XAML in WPF.

Eventos enrutadosRouted events

Una característica especial de los eventos que es fundamental para WPFWPF es un evento enrutado.A particular event feature that is fundamental to WPFWPF is a routed event. Los eventos enrutados permiten a un elemento controlar un evento generado por otro elemento diferente, siempre que dichos elementos estén relacionados entre sí a través de un árbol.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. Al especificar el control de eventos con un atributo XAML, se puede escuchar y controlar el evento enrutado en cualquier elemento, incluidos los elementos que no contienen ese evento concreto en la tabla de miembros de clase.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. Esto se consigue calificando el atributo de nombre de evento con el nombre de la clase propietaria.This is accomplished by qualifying the event name attribute with the owning class name. Por ejemplo, el elemento primario StackPanel en el curso StackPanel / Button ejemplo podría registrar un controlador para el botón de elemento secundarios Click eventos especificando el atributo Button.Click en el StackPanel elemento de objeto, con el nombre del controlador como el valor del 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 obtener más información sobre el funcionamiento de los eventos enrutados, vea Información general sobre eventos enrutados.For more information about how routed events work, see Routed Events Overview.

XAML elementos con nombreXAML named elements

De manera predeterminada, la instancia de objeto que se crea en un gráfico de objetos al procesar un elemento de objeto XAML no posee un identificador único o una referencia 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 el contrario, si llama a un constructor en el código, casi siempre usa el resultado del constructor para establecer una variable en la instancia creada, de manera que pueda hacer referencia a dicha instancia posteriormente en el 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 proporcionar acceso normalizado a los objetos creados mediante una definición de marcado, XAML define el atributo x:Name.In order to provide standardized access to objects that were created through a markup definition, XAML defines the x:Name attribute. Es posible establecer el valor del atributo x:Name en cualquier elemento de objeto.You can set the value of the x:Name attribute on any object element. En el código subyacente, el identificador elegido es equivalente a una variable de instancia que hace referencia a la instancia creada.In your code-behind, the identifier you choose is equivalent to an instance variable that refers to the constructed instance. Los elementos con nombre funcionan en todos los sentidos como si fueran instancias de objeto (el nombre hace referencia a la instancia) y el código subyacente puede hacer referencia a dichos elementos para controlar las interacciones en tiempo de ejecución dentro de la aplicación.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. Esta conexión entre las instancias y las variables se logra mediante el compilador de marcado WPF XAML y, más específicamente, implica características y patrones como InitializeComponent que no se tratarán en detalle en este tema.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 nivel de marco WPF heredan una Name propiedad, que es equivalente a la XAML definido x:Name atributo.WPF framework-level XAML elements inherit a Name property, which is equivalent to the XAML defined x:Name attribute. Otras clases también proporcionan equivalentes en el nivel de propiedad para x:Name, que en general también suele definirse como una propiedad Name.Certain other classes also provide property-level equivalents for x:Name, which is also generally defined as a Name property. En general, si no puede localizar una propiedad Name en la tabla de miembros del elemento/tipo elegido, use x:Name en su lugar.Generally speaking, if you cannot find a Name property in the members table for your chosen element/type, use x:Name instead. El x:Name valores proporcionará un identificador a un elemento XAML que se puede utilizar en tiempo de ejecución por subsistemas concretos o por métodos de utilidad como FindName.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.

El ejemplo siguiente se establece Name en un StackPanel elemento.The following example sets Name on a StackPanel element. A continuación, un controlador en un Button dentro de ese StackPanel referencias el StackPanel a través de su referencia de instancia buttonContainer como lo establece Name.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

Al igual que una variable, el nombre XAML de una instancia está regido por un concepto de ámbito, de manera que se puedan aplicar los nombres para que sean únicos dentro de un ámbito predecible.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. El marcado primario que define una página indica un ámbito de nombres de código XAML único, siendo el límite de dicho ámbito el elemento raíz de la 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. En cambio, otros orígenes de marcado pueden interactuar con una página en tiempo de ejecución, por ejemplo, los estilos o las plantillas incluidas en los estilos, y dichos orígenes tienen a menudo su propio ámbito de nombres de código XAML que no tiene por qué estar conectado necesariamente con el de la 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 obtener más información sobre x:Name y ámbitos de nombres XAML, vea Name, x: Name Directive, o ámbitos de nombres de XAML de WPF.For more information on x:Name and XAML namescopes, see Name, x:Name Directive, or WPF XAML Namescopes.

Las propiedades adjuntas y eventos adjuntosAttached properties and attached events

XAML incluye una característica de lenguaje que permite especificar ciertas propiedades o eventos en cualquier elemento, independientemente de si la propiedad o el evento existe en las definiciones del tipo para el elemento en el que se establece.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. La versión de esta característica para las propiedades se denomina propiedad adjunta y la versión para los eventos se denomina evento adjunto.The properties version of this feature is called an attached property, the events version is called an attached event. Conceptualmente, las propiedades y los eventos adjuntos se pueden considerar como miembros globales que se pueden establecer en cualquier elemento o instancia de objeto XAML.Conceptually, you can think of attached properties and attached events as global members that can be set on any XAML element/object instance. En cambio, ese elemento, clase o infraestructura mayor debe admitir un almacén de propiedades de respaldo para los valores adjuntos.However, that element/class or a larger infrastructure must support a backing property store for the attached values.

Las propiedades adjuntas de código XAML se usan normalmente mediante la sintaxis de atributos.Attached properties in XAML are typically used through attribute syntax. En la sintaxis de atributos, una propiedad adjunta se especifica con el formato tipoDePropietario.nombreDePropiedad.In attribute syntax, you specify an attached property in the form ownerType.propertyName.

A primera vista, esto se parece al uso de un elemento de propiedad, pero en este caso el tipoDePropietario que se especifica es siempre un tipo distinto del elemento de objeto en el que se establece la propiedad adjunta.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. tipoDePropietario es el tipo que proporciona los métodos de descriptor de acceso que un procesador XAML necesita para poder obtener o establecer el valor de propiedad adjunto.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.

El escenario más común para las propiedades adjuntas es permitir a los elementos secundarios enviar un valor de propiedad a su elemento primario.The most common scenario for attached properties is to enable child elements to report a property value to their parent element.

El ejemplo siguiente ilustra la DockPanel.Dock propiedad adjunta.The following example illustrates the DockPanel.Dock attached property. El DockPanel clase define los descriptores de acceso DockPanel.Dock y, por tanto, tiene la propiedad adjunta.The DockPanel class defines the accessors for DockPanel.Dock and therefore owns the attached property. El DockPanel clase también incluye la lógica que recorre en iteración sus elementos secundarios y específicamente comprueba si cada elemento tiene un valor de conjunto de DockPanel.Dock.The DockPanel class also includes logic that iterates its child elements and specifically checks each element for a set value of DockPanel.Dock. Si se encuentra dicho valor, este se usa durante el diseño para colocar los elementos secundarios.If a value is found, that value is used during layout to position the child elements. El uso de la DockPanel.Dock propiedad adjunta y esta función de posición es en realidad el escenario de motivación para la DockPanel clase.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>

En WPFWPF, la mayoría de las propiedades adjuntas se implementan también como propiedades de dependencia.In WPFWPF, most or all the attached properties are also implemented as dependency properties. Para obtener información detallada, vea Información general sobre propiedades asociadas.For details, see Attached Properties Overview.

Los eventos adjuntos usan un formato de sintaxis de atributos similar: tipoDePropietario.nombreDeEvento.Attached events use a similar ownerType.eventName form of attribute syntax. Al igual que en los eventos no adjuntos, el valor del atributo para un evento adjunto en código XAML especifica el nombre del método controlador que se invoca cuando se controla el evento en el 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. Los usos de eventos adjuntos en código XAML de WPF son menos comunes.Attached event usages in WPF XAML are less common. Para obtener más información, vea Información general sobre eventos adjuntos.For more information, see Attached Events Overview.

Tipos base y XAMLBase types and XAML

Debajo del código XAML de WPF y su espacio de nombres XAML existe una colección de tipos que corresponden a los objetos de CLRCLR, así como elementos de marcado para XAML.Underlying WPF XAML and its XAML namespace is a collection of types that correspond to CLRCLR objects in addition to markup elements for XAML. En cambio, no todas las clases se pueden asignar a elementos.However, not all classes can be mapped to elements. Abstracta, como clases, ButtonBase, y ciertas clases base no abstractas se usan para la herencia en el CLRCLR el modelo de objetos.Abstract classes, such as ButtonBase, and certain nonabstract base classes are used for inheritance in the CLRCLR objects model. Las clases base, incluidas las abstractas, son importantes para el desarrollo de código XAML porque cada uno de los elementos de código XAML concretos hereda miembros de alguna clase base en su jerarquía.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. A menudo, estos miembros incluyen propiedades que se pueden establecer como atributos en el elemento o eventos que se pueden controlar.Often these members include properties that can be set as attributes on the element, or events that can be handled. FrameworkElement es la base concreta IUUI clase de WPFWPF en el nivel de marco WPF.FrameworkElement is the concrete base IUUI class of WPFWPF at the WPF framework level. Al diseñar IUUI, usará diversas formas, panel, decorator o clases de control, que todos se derivan de FrameworkElement.When designing IUUI, you will use various shape, panel, decorator, or control classes, which all derive from FrameworkElement. Una clase base relacionada, FrameworkContentElement, admite elementos orientados a documentos que funcionan bien para una presentación de diseño de flujo utilizando APIAPIs que reflejan deliberadamente el APIAPIs en FrameworkElement.A related base class, FrameworkContentElement, supports document-oriented elements that work well for a flow layout presentation, using APIAPIs that deliberately mirror the APIAPIs in FrameworkElement. La combinación de atributos en el nivel de elemento y un modelo de objetos de CLRCLR proporciona un conjunto de propiedades comunes que se pueden establecer en la mayoría de los elementos de código XAML concretos, independientemente del tipo de elemento XAML específico y su tipo subyacente.The combination of attributes at the element level and a CLRCLR 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.

Seguridad XAMLXAML security

XAML es un lenguaje de marcado que representa directamente la creación de instancias y la ejecución de objetos.XAML is a markup language that directly represents object instantiation and execution. Por consiguiente, los elementos creados en código XAML tienen la misma capacidad de interactuar con los recursos del sistema (por ejemplo, el acceso a la red y la E/S del sistema de archivos) que el código generado equivalente.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.

WPFWPF admite el marco de trabajo de seguridad Seguridad de acceso del código (CAS)Code Access Security (CAS) de .NET Framework 4.NET Framework 4. supports the .NET Framework 4.NET Framework 4 security framework Seguridad de acceso del código (CAS)Code Access Security (CAS). Esto significa que el contenido de WPFWPF que se ejecuta en la zona de Internet tiene permisos de ejecución reducidos.This means that WPFWPF content running in the internet zone has reduced execution permissions. "Pierden el XAML" (las páginas de XAML no compilado interpretan en tiempo de carga con un visor XAML) y Aplicación del explorador XAML (XBAP)XAML browser application (XBAP) normalmente se ejecutan en esta zona de internet y use el mismo conjunto de permisos."Loose XAML" (pages of noncompiled XAML interpreted at load time by a XAML viewer) and Aplicación del explorador XAML (XBAP)XAML browser application (XBAP) are usually run in this internet zone and use the same permission set. Sin embargo, XAML cargado en una aplicación de plena confianza tiene el mismo acceso a los recursos del sistema, como hace la aplicación de hospedaje.However, XAML loaded in to a fully trusted application has the same access to the system resources as the hosting application does. Para obtener más información, vea Seguridad de confianza parcial de WPF.For more information, see WPF Partial Trust Security.

Cargar XAML desde códigoLoading XAML from code

XAML se puede usar para definir la totalidad de la interfaz de usuario, pero a veces también es conveniente definir solo una parte de dicha interfaz en código 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. Esta función se podría usar para habilitar una personalización parcial, para el almacenamiento local de información, para proporcionar un objeto comercial mediante código XAML o para diversos escenarios posibles.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. La clave para estos escenarios es la XamlReader clase y su Load método.The key to these scenarios is the XamlReader class and its Load method. La entrada es un archivo XAML y la salida es un objeto que representa la totalidad del árbol de objetos en tiempo de ejecución que se ha creado a partir de ese marcado.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. Después, se puede insertar el objeto como una propiedad de otro objeto que ya existe en la aplicación.You then can insert the object to be a property of another object that already exists in the application. Siempre que la propiedad sea una propiedad adecuada en el modelo de contenido que tiene funciones de presentación y que notifica al motor de ejecución que se ha agregado el nuevo contenido a la aplicación, es posible modificar con gran facilidad el contenido de una aplicación en ejecución si se carga código 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. Tenga en cuenta que esta función normalmente solo está disponible en las aplicaciones de plena confianza, debido a las implicaciones de seguridad obvias de la carga de archivos en aplicaciones que se están ejecutando.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.

Pasos adicionalesWhat's next

En este tema se proporciona una introducción básica a la terminología y los conceptos de la sintaxis XAML que se aplica en WPF.This topic provides a basic introduction to XAML syntax concepts and terminology as it applies to WPF. Para obtener más información sobre los términos usados aquí, vea Detalles de la sintaxis XAML.For more information about the terms used here, see XAML Syntax In Detail.

Si aún no lo ha hecho, intente realizar los ejercicios del tutorial Tutorial: Mi primera aplicación de escritorio de WPF.If you have not already done this, try the exercises in the tutorial topic Walkthrough: My first WPF desktop application. Crear la aplicación centrada en el marcado descrita en el tutorial le ayudará a reforzar muchos de los conceptos descritos en este tema.When you create the markup-centric application described by the tutorial, the exercise will help reinforce many of the concepts described in this topic.

WPFWPF usa un modelo de aplicación determinado que se basa en el Application clase. uses a particular application model that is based on the Application class. Para obtener información detallada, vea Información general sobre la administración de aplicaciones.For details, see Application Management Overview.

Compilar una aplicación de WPF (WPF) le ofrece información más detallada sobre cómo compilar aplicaciones que incluyen código XAML desde la línea de comandos y con 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.

Información general sobre las propiedades de dependencia le ofrece más información sobre la versatilidad de las propiedades en WPFWPF, e introduce el concepto de propiedades de dependencia.Dependency Properties Overview gives more information about the versatility of properties in WPFWPF, and introduces the concept of dependency properties.

Vea tambiénSee also

Detalles de la sintaxis XAMLXAML Syntax In Detail
Clases XAML y personalizadas para WPFXAML and Custom Classes for WPF
Características de lenguaje (x:) de espacios de nombres XAMLXAML Namespace (x:) Language Features
Extensiones XAML de WPFWPF XAML Extensions
Información general sobre elementos baseBase Elements Overview
Árboles en WPFTrees in WPF