Compartir a través de


Guía de sintaxis XAML

Explicamos las reglas de sintaxis XAML y la terminología que describe las restricciones o opciones disponibles para la sintaxis XAML. Encontrarás este tema útil si no estás familiarizado con el lenguaje XAML, quieres un actualizador en la terminología o partes de la sintaxis, o estás curioso sobre cómo funciona el lenguaje XAML y quieres más contexto y fondo.

XAML es XML

Extensible Application Markup Language (XAML) tiene una sintaxis básica que se basa en XML y, por definición, XAML válido debe ser XML válido. Pero XAML también tiene sus propios conceptos de sintaxis que extienden XML. Una entidad XML determinada podría ser válida en XML sin formato, pero esa sintaxis podría tener un significado diferente y más completo como XAML. En este tema se explican estos conceptos de sintaxis XAML.

Vocabularios XAML

Un área en la que XAML difiere de la mayoría de los usos XML es que XAML no suele aplicarse con un esquema, como un archivo XSD. Esto se debe a que XAML está pensado para ser extensible, eso es lo que significa "X" en el acrónimo XAML. Una vez analizado XAML, se espera que existan los elementos y atributos a los que hace referencia en XAML en alguna representación de código de respaldo, ya sea en los tipos principales definidos por Windows Runtime o en tipos que extienden o se basan en Windows Runtime. La documentación del SDK a veces hace referencia a los tipos que ya están integrados en Windows Runtime y se pueden usar en XAML como vocabulario XAML para Windows Runtime. Microsoft Visual Studio le ayuda a generar un marcado válido dentro de este vocabulario XAML. Visual Studio también puede incluir los tipos personalizados para el uso de XAML siempre que se haga referencia al origen de esos tipos correctamente en el proyecto. Para obtener más información sobre los tipos XAML y personalizados, consulta Espacios de nombres XAML y asignación de espacios de nombres.

Declarar objetos

Los programadores suelen pensar en términos de objetos y miembros, mientras que un lenguaje de marcado se conceptualiza como elementos y atributos. En el sentido más básico, un elemento que declaras en el marcado XAML se convierte en un objeto en una representación de objeto en tiempo de ejecución de respaldo. Para crear un objeto en tiempo de ejecución para la aplicación, declaras un elemento XAML en el marcado XAML. El objeto se crea cuando Windows Runtime carga el XAML.

Un archivo XAML siempre tiene exactamente un elemento que actúa como raíz, que declara un objeto que será la raíz conceptual de alguna estructura de programación, como una página, o el gráfico de objetos de toda la definición en tiempo de ejecución de una aplicación.

En términos de sintaxis XAML, hay tres maneras de declarar objetos en XAML:

  • Directamente, mediante la sintaxis del elemento object: usa etiquetas de apertura y cierre para crear instancias de un objeto como un elemento xml-form. Puede usar esta sintaxis para declarar objetos raíz o para crear objetos anidados que establezcan valores de propiedad.
  • Indirectamente, mediante la sintaxis de atributo: usa un valor de cadena insertado que tiene instrucciones para crear un objeto. El analizador XAML usa esta cadena para establecer el valor de una propiedad en un valor de referencia recién creado. La compatibilidad con ella se limita a ciertos objetos y propiedades comunes.
  • Uso de una extensión de marcado.

Esto no significa que siempre tengas la opción de cualquier sintaxis para la creación de objetos en un vocabulario XAML. Algunos objetos solo se pueden crear mediante la sintaxis del elemento object. Algunos objetos solo se pueden crear estableciendo inicialmente en un atributo . De hecho, los objetos que se pueden crear con sintaxis de elemento de objeto o atributo son comparativamente poco frecuentes en los vocabularios XAML. Incluso si ambas formas de sintaxis son posibles, una de las sintaxis será más común como cuestión de estilo. También hay técnicas que puedes usar en XAML para hacer referencia a objetos existentes en lugar de crear nuevos valores. Es posible que los objetos existentes se definan en otras áreas de XAML o que existan implícitamente a través de algún comportamiento de la plataforma y sus modelos de programación o aplicación.

Declaración de un objeto mediante la sintaxis de elementos de objeto

Para declarar un objeto con sintaxis de elemento de objeto, escriba etiquetas como esta: <objectName> </objectName>, donde objectName es el nombre de tipo del objeto al que desea crear instancias. Este es el uso del elemento de objeto para declarar un objeto Canvas:

<Canvas>
</Canvas>

Si el objeto no contiene otros objetos, puede declarar el elemento de objeto mediante una etiqueta de autocierre en lugar de un par de apertura y cierre: <Canvas />

Contenedores

Muchos objetos usados como elementos de interfaz de usuario, como Canvas, pueden contener otros objetos. A veces se conocen como contenedores. En el ejemplo siguiente se muestra un contenedor canvas que contiene un elemento, un rectángulo.

<Canvas>
  <Rectangle />
</Canvas>

Declaración de un objeto mediante la sintaxis de atributo

Dado que este comportamiento está vinculado a la configuración de la propiedad, hablaremos de esto más en las próximas secciones.

Texto de inicialización

Para algunos objetos, puede declarar nuevos valores mediante texto interno que se usa como valores de inicialización para la construcción. En XAML, esta técnica y sintaxis se denomina texto de inicialización. Conceptualmente, el texto de inicialización es similar a llamar a un constructor que tiene parámetros. El texto de inicialización es útil para establecer valores iniciales de determinadas estructuras.

A menudo se usa una sintaxis de elemento de objeto con texto de inicialización si desea un valor de estructura con una x:Key, por lo que puede existir en un ResourceDictionary. Puede hacerlo si comparte ese valor de estructura entre varias propiedades de destino. En algunas estructuras, no se puede usar la sintaxis de atributo para establecer los valores de la estructura: el texto de inicialización es la única manera de generar un recurso CornerRadius, Thickness, GridLength o Color útil y compartido.

En este ejemplo abreviado se usa el texto de inicialización para especificar valores para un grosor, en este caso especificando valores que establecen left y right en 20, y tanto Top como Bottom en 10. En este ejemplo se muestra el Grosor creado como un recurso con clave y, a continuación, la referencia a ese recurso. Para obtener más información sobre el texto de inicialización de grosor, consulta Grosor.

<UserControl ...>
  <UserControl.Resources>
    <Thickness x:Key="TwentyTenThickness">20,10</Thickness>
    ....
  </UserControl.Resources>
  ...
  <Grid Margin="{StaticResource TwentyTenThickness}">
  ...
  </Grid>
</UserControl ...>

Nota Algunas estructuras no se pueden declarar como elementos de objeto. No se admite el texto de inicialización y no se pueden usar como recursos. Debes usar una sintaxis de atributo para establecer propiedades en estos valores en XAML. Estos tipos son: Duration, RepeatBehavior, Point, Rect y Size.

Configurar propiedades

Puede establecer propiedades en objetos declarados mediante la sintaxis de elementos de objeto. Hay varias maneras de establecer propiedades en XAML:

  • Mediante la sintaxis de atributo.
  • Mediante la sintaxis del elemento de propiedad.
  • Mediante la sintaxis de elementos donde el contenido (texto interno o elementos secundarios) establece la propiedad de contenido XAML de un objeto.
  • Mediante el uso de una sintaxis de colección (que suele ser la sintaxis de colección implícita).

Al igual que con la declaración de objeto, esta lista no implica que se pueda establecer ninguna propiedad con cada una de las técnicas. Algunas propiedades solo admiten una de las técnicas. Algunas propiedades admiten más de un formulario; Por ejemplo, hay propiedades que pueden usar la sintaxis de elemento de propiedad o la sintaxis de atributo. Lo que es posible depende de la propiedad y del tipo de objeto que usa la propiedad. En la referencia de la API de Windows Runtime, verás los usos xaml que puedes usar en la sección Sintaxis . A veces hay un uso alternativo que funcionaría, pero sería más detallado. Esos usos detallados no siempre se muestran porque estamos intentando mostrar los procedimientos recomendados o los escenarios reales para usar esa propiedad en XAML. Las instrucciones para la sintaxis XAML se proporcionan en las secciones Uso de XAML de páginas de referencia para propiedades que se pueden establecer en XAML.

Algunas propiedades de los objetos no se pueden establecer en XAML por ningún medio y solo se pueden establecer mediante código. Normalmente, estas son propiedades que son más adecuadas para trabajar con en el código subyacente, no en XAML.

No se puede establecer una propiedad de solo lectura en XAML. Incluso en el código, el tipo propietario tendría que admitir alguna otra manera de establecerlo, como una sobrecarga de constructor, un método auxiliar o una compatibilidad con propiedades calculadas. Una propiedad calculada se basa en los valores de otras propiedades que se pueden establecer más a veces un evento con control integrado; estas características están disponibles en el sistema de propiedades de dependencia. Para obtener más información sobre cómo son útiles las propiedades de dependencia para la compatibilidad con propiedades calculadas, consulte Introducción a las propiedades de dependencia.

La sintaxis de colección en XAML da una apariencia de que estás estableciendo una propiedad de solo lectura, pero de hecho no eres. Vea "Sintaxis de colección" más adelante en este tema.

Establecimiento de una propiedad mediante la sintaxis de atributo

Establecer un valor de atributo es el medio típico por el que se establece un valor de propiedad en un lenguaje de marcado, por ejemplo, en XML o HTML. Establecer atributos XAML es similar a cómo establecer valores de atributo en XML. El nombre del atributo se especifica en cualquier punto dentro de las etiquetas que siguen al nombre del elemento, separados del nombre del elemento por al menos un espacio en blanco. El nombre del atributo va seguido de un signo igual. El valor del atributo se encuentra dentro de un par de comillas. Las comillas pueden ser comillas dobles o comillas simples siempre que coincidan y incluyan el valor. El propio valor del atributo debe expresarse como una cadena. La cadena suele contener números, pero en XAML, todos los valores de atributo son valores de cadena hasta que el analizador XAML participa y realiza alguna conversión de valor básica.

En este ejemplo se usa la sintaxis de atributo para cuatro atributos para establecer las propiedades Name, Width, Height y Fill de un objeto Rectangle.

<Rectangle Name="rectangle1" Width="100" Height="100" Fill="Blue" />

Establecimiento de una propiedad mediante la sintaxis del elemento de propiedad

Muchas propiedades de un objeto se pueden establecer mediante la sintaxis del elemento de propiedad. Un elemento de propiedad tiene el siguiente aspecto: <propiedad> de objeto..

Para usar la sintaxis del elemento de propiedad, crea elementos de propiedad XAML para la propiedad que quiere establecer. En XML estándar, este elemento solo se consideraría un elemento que tiene un punto en su nombre. Sin embargo, en XAML, el punto del nombre del elemento identifica el elemento como un elemento de propiedad, con la propiedad esperada como miembro del objeto en una implementación del modelo de objetos de respaldo. Para usar la sintaxis del elemento de propiedad, debe ser posible especificar un elemento de objeto para "rellenar" las etiquetas del elemento de propiedad. Un elemento de propiedad siempre tendrá algún contenido (elemento único, varios elementos o texto interno); no hay ningún punto en tener un elemento de propiedad auto-closing.

En la gramática siguiente, la propiedad es el nombre de la propiedad que desea establecer y propertyValueAsObjectElement es un único elemento de objeto, que se espera que satisfaga los requisitos de tipo de valor de la propiedad.

<object>

<propiedad de objeto.>

propertyValueAsObjectElement

</propiedad de objeto.>

</object>

En el ejemplo siguiente se usa la sintaxis de elemento de propiedad para establecer el relleno de un rectángulo con un elemento de objeto SolidColorBrush. (Dentro de SolidColorBrush, Color se establece como un atributo). El resultado analizado de este XAML es idéntico al ejemplo de XAML anterior que establece Fill mediante la sintaxis de atributo.

<Rectangle
  Name="rectangle1"
  Width="100" 
  Height="100"
> 
  <Rectangle.Fill> 
    <SolidColorBrush Color="Blue"/> 
  </Rectangle.Fill>
</Rectangle>

Vocabularios XAML y programación orientada a objetos

Las propiedades y los eventos a medida que aparecen como miembros XAML de un tipo XAML de Windows Runtime a menudo se heredan de los tipos base. Considere este ejemplo: <Button Background="Blue" .../>. La propiedad Background no es una propiedad declarada inmediatamente en la clase Button. En su lugar, background se hereda de la clase Control base. De hecho, si examina el tema de referencia de Button, verá que las listas de miembros contienen al menos un miembro heredado de cada una de una cadena de clases base sucesivas: ButtonBase, Control, FrameworkElement, UIElement, DependencyObject. En la lista Propiedades , todas las propiedades de lectura y escritura y las propiedades de colección se heredan en un sentido de vocabulario XAML. Los eventos (como los distintos eventos UIElement ) también se heredan.

Si usas la referencia de Windows Runtime para instrucciones XAML, el nombre del elemento que se muestra en una sintaxis o incluso en código de ejemplo a veces es para el tipo que define originalmente la propiedad, ya que todos los tipos posibles que heredan de una clase base comparten ese tema de referencia. Si usas IntelliSense de Visual Studio para XAML en el editor XML, IntelliSense y sus listas desplegables realizan un gran trabajo de fusión de la herencia y proporcionan una lista precisa de atributos que están disponibles para establecer una vez que hayas empezado con un elemento de objeto para una instancia de clase.

Propiedades de contenido XAML

Algunos tipos definen una de sus propiedades de forma que la propiedad habilita una sintaxis de contenido XAML. Para la propiedad de contenido XAML de un tipo, puedes omitir el elemento de propiedad de esa propiedad al especificarla en XAML. O bien, puede establecer la propiedad en un valor de texto interno proporcionando ese texto interno directamente dentro de las etiquetas de elemento de objeto del tipo propietario. Las propiedades de contenido XAML admiten una sintaxis de marcado sencilla para esa propiedad y hacen que el XAML sea más legible al reducir el anidamiento.

Si hay disponible una sintaxis de contenido XAML, esa sintaxis se mostrará en las secciones "XAML" de Sintaxis para esa propiedad en la documentación de referencia de Windows Runtime. Por ejemplo, la página de propiedades Child de Border muestra la sintaxis de contenido XAML en lugar de la sintaxis del elemento de propiedad para establecer el valor Border.Child de un objeto único de border, de la siguiente manera:

<Border>
  <Button .../>
</Border>

Si la propiedad que se declara como la propiedad de contenido XAML es el tipo Object, o es string, la sintaxis de contenido XAML admite lo que es básicamente texto interno en el modelo de documento XML: una cadena entre las etiquetas de objeto de apertura y cierre. Por ejemplo, la página de propiedades Text de TextBlock muestra la sintaxis de contenido XAML que tiene un valor de texto interno para establecer Text, pero la cadena "Text" nunca aparece en el marcado. Observa el siguiente ejemplo de uso:

<TextBlock>Hello!</TextBlock>

Si existe una propiedad de contenido XAML para una clase, se indica en el tema de referencia de la clase, en la sección "Atributos". Busque el valor de ContentPropertyAttribute. Este atributo usa un campo con nombre "Name". El valor de "Name" es el nombre de la propiedad de esa clase que es la propiedad de contenido XAML. Por ejemplo, en la página Referencia de borde , verá esto: ContentProperty("Name=Child").

Una regla importante de sintaxis XAML que debemos mencionar es que no puedes mezclar la propiedad de contenido XAML y otros elementos de propiedad que estableces en el elemento. La propiedad de contenido XAML debe establecerse completamente antes de cualquier elemento de propiedad o completamente después. Por ejemplo, este código XAML no es válido:

<StackPanel>
  <Button>This example</Button>
  <StackPanel.Resources>
    <SolidColorBrush x:Key="BlueBrush" Color="Blue"/>
  </StackPanel.Resources>
  <Button>... is illegal XAML</Button>
</StackPanel>

Sintaxis de colecciones

Todas las sintaxis mostradas hasta ahora establecen propiedades en objetos individuales. Pero muchos escenarios de interfaz de usuario requieren que un elemento primario determinado pueda tener varios elementos secundarios. Por ejemplo, una interfaz de usuario para un formulario de entrada necesita varios elementos de cuadro de texto, algunas etiquetas y quizás un botón "Enviar". Aun así, si usara un modelo de objetos de programación para tener acceso a estos varios elementos, normalmente serían elementos de una sola propiedad de colección, en lugar de que cada elemento sea el valor de propiedades diferentes. XAML admite varios elementos secundarios, así como admitir un modelo de colección de respaldo típico tratando las propiedades que usan un tipo de colección como implícito y realizando un control especial para cualquier elemento secundario de un tipo de colección.

Muchas propiedades de colección también se identifican como la propiedad de contenido XAML para la clase . La combinación de procesamiento implícito de colecciones y sintaxis de contenido XAML se ve con frecuencia en tipos usados para la redacción de controles, como paneles, vistas o controles de elementos. Por ejemplo, en el ejemplo siguiente se muestra el CÓDIGO XAML más sencillo posible para componer dos elementos de interfaz de usuario del mismo nivel dentro de stackPanel.

<StackPanel>
  <TextBlock>Hello</TextBlock>
  <TextBlock>World</TextBlock>
</StackPanel>

Mecanismo de sintaxis de colección XAML

Es posible que al principio aparezca que XAML habilita un "conjunto" de la propiedad de colección de solo lectura. En realidad, lo que XAML habilita aquí es agregar elementos a una colección existente. El lenguaje XAML y los procesadores XAML que implementan compatibilidad con XAML se basan en una convención en los tipos de colección de respaldo para habilitar esta sintaxis. Normalmente, hay una propiedad de respaldo, como un indexador o una propiedad Items que hace referencia a elementos específicos de la colección. Por lo general, esa propiedad no es explícita en la sintaxis XAML. En el caso de las colecciones, el mecanismo subyacente para el análisis de XAML no es una propiedad, sino un método: en concreto, el método Add en la mayoría de los casos. Cuando el procesador XAML encuentra uno o varios elementos de objeto dentro de una sintaxis de colección XAML, cada objeto de este tipo se crea por primera vez a partir de un elemento y, a continuación, se agrega cada nuevo objeto para la colección contenedora llamando al método Add de la colección.

Cuando un analizador XAML agrega elementos a una colección, es la lógica del método Add que determina si un elemento XAML determinado es un elemento secundario permitido del objeto de colección. Muchos tipos de colección están fuertemente tipados por la implementación de respaldo, lo que significa que el parámetro de entrada de Add espera que lo que se pase debe ser una coincidencia de tipo con el tipo de parámetro Add .

En el caso de las propiedades de la colección, tenga cuidado al intentar especificar la colección explícitamente como un elemento de objeto. Un analizador XAML creará un nuevo objeto cada vez que encuentre un elemento de objeto. Si la propiedad de colección que intentas usar es de solo lectura, esto puede producir una excepción de análisis XAML. Solo tiene que usar la sintaxis de colección implícita y no verá esa excepción.

Cuándo usar la sintaxis de elemento de atributo o propiedad

Todas las propiedades que admiten establecerse en XAML admitirán la sintaxis de atributo o elemento de propiedad para la configuración de valor directo, pero posiblemente no admitirán ninguna sintaxis indistintamente. Algunas propiedades admiten cualquiera de las sintaxis y algunas propiedades admiten opciones de sintaxis adicionales, como una propiedad de contenido XAML. El tipo de sintaxis XAML compatible con una propiedad depende del tipo de objeto que la propiedad usa como su tipo de propiedad. Si el tipo de propiedad es un tipo primitivo, como un tipo double (float o decimal), entero, booleano o cadena, la propiedad siempre admite la sintaxis de atributo.

También puede usar la sintaxis de atributo para establecer una propiedad si el tipo de objeto que usa para establecer esa propiedad se puede crear mediante el procesamiento de una cadena. En el caso de los primitivos, siempre es el caso, la conversión de tipos se compila en el analizador. Sin embargo, algunos otros tipos de objeto también se pueden crear mediante una cadena especificada como valor de atributo, en lugar de un elemento de objeto dentro de un elemento de propiedad. Para que esto funcione, debe haber una conversión de tipos subyacente, compatible con esa propiedad concreta o compatible con generalmente para todos los valores que usan ese tipo de propiedad. El valor de cadena del atributo se usa para establecer propiedades que son importantes para la inicialización del nuevo valor de objeto. Potencialmente, un convertidor de tipos específico también puede crear subclases diferentes de un tipo de propiedad común, dependiendo de cómo procesa de forma única la información de la cadena. Los tipos de objeto que admiten este comportamiento tendrán una gramática especial enumerada en la sección de sintaxis de la documentación de referencia. Por ejemplo, la sintaxis XAML de Brush muestra cómo se puede usar una sintaxis de atributo para crear un nuevo valor SolidColorBrush para cualquier propiedad de tipo Brush (y hay muchas propiedades Brush en XAML de Windows Runtime).

Lógica y reglas de análisis de XAML

En algún momento es informativo leer el XAML de forma similar a cómo un analizador XAML debe leerlo: como un conjunto de tokens de cadena encontrados en un orden lineal. Un analizador XAML debe interpretar estos tokens en un conjunto de reglas que forman parte de la definición de cómo funciona XAML.

Establecer un valor de atributo es el medio típico por el que se establece un valor de propiedad en un lenguaje de marcado, por ejemplo, en XML o HTML. En la sintaxis siguiente, objectName es el objeto que desea crear una instancia, propertyName es el nombre de la propiedad que desea establecer en ese objeto y propertyValue es el valor que se va a establecer.

<objectName propertyName="propertyValue" .../>

-or-

<objectName propertyName="propertyValue">

...<!--element children -->

</objectName>

Cualquiera de las sintaxis permite declarar un objeto y establecer una propiedad en ese objeto. Aunque el primer ejemplo es un solo elemento en el marcado, aquí hay pasos discretos con respecto a cómo un procesador XAML analiza este marcado.

En primer lugar, la presencia del elemento de objeto indica que se debe crear una instancia de un nuevo objeto objectName . Solo después de que exista dicha instancia, la propiedad propertyName de instancia se puede establecer en ella.

Otra regla de XAML es que los atributos de un elemento deben poder establecerse en cualquier orden. Por ejemplo, no hay ninguna diferencia entre <Rectangle Height="50" Width="100" /> y <Rectangle Width="100" Height="50" />. El orden que se usa es una cuestión de estilo.

Nota Los diseñadores XAML suelen promover convenciones de ordenación si usas superficies de diseño distintas del editor XML, pero puedes editar libremente ese XAML más adelante, para reordenar los atributos o introducir otros nuevos.

Propiedades adjuntas

XAML extiende XML agregando un elemento de sintaxis conocido como una propiedad adjunta. De forma similar a la sintaxis del elemento de propiedad, la sintaxis de propiedad adjunta contiene un punto y el punto contiene un significado especial para el análisis xaml. En concreto, el punto separa el proveedor de la propiedad adjunta y el nombre de la propiedad.

En XAML, estableces propiedades adjuntas mediante la sintaxis AttachedPropertyProvider.PropertyName Este es un ejemplo de cómo puedes establecer la propiedad adjunta Canvas.Left en XAML:

<Canvas>
  <Button Canvas.Left="50">Hello</Button>
</Canvas>

Puede establecer la propiedad adjunta en los elementos que no tienen una propiedad de ese nombre en el tipo de respaldo y, de ese modo, funcionan como una propiedad global o un atributo definido por un espacio de nombres XML diferente, como el atributo xml:space .

En XAML de Windows Runtime, verá propiedades adjuntas que admiten estos escenarios:

Para obtener más información, consulta Información general sobre las propiedades adjuntas.

Valores literales "{"

Dado que el símbolo de llave de apertura { es la apertura de la secuencia de extensión de marcado, se usa una secuencia de escape para especificar un valor de cadena literal que comienza por "{". La secuencia de escape es "{}". Por ejemplo, para especificar un valor de cadena que es una llave de apertura única, especifique el valor del atributo como "{}{". También puede usar las comillas alternativas (por ejemplo, " dentro de un valor de atributo delimitado por "") para proporcionar un valor "{" como una cadena.

Nota "\}" también funciona si está dentro de un atributo entre comillas.  

Valores de enumeración

Muchas propiedades de la API de Windows Runtime usan enumeraciones como valores. Si el miembro es una propiedad de lectura y escritura, puede establecer dicha propiedad proporcionando un valor de atributo. Identifica qué valor de enumeración se va a usar como valor de la propiedad mediante el nombre no completo del nombre de constante . Por ejemplo, aquí se muestra cómo establecer UIElement.Visibility en XAML: <Button Visibility="Visible"/>. Aquí el elemento "Visible" como una cadena se asigna directamente a una constante con nombre de la enumeración Visibility, Visible.

  • No use un formulario calificado, no funcionará. Por ejemplo, este código XAML no es válido: <Button Visibility="Visibility.Visible"/>.
  • No use el valor de la constante. En otras palabras, no se base en el valor entero de la enumeración que está allí explícita o implícitamente en función de cómo se definió la enumeración. Aunque puede parecer que funciona, es un procedimiento incorrecto en XAML o en código porque se basa en lo que podría ser un detalle transitorio de la implementación. Por ejemplo, no haga esto: <Button Visibility="1"/>.

Nota En los temas de referencia de las API que usan XAML y usan enumeraciones, haz clic en el vínculo al tipo de enumeración en la sección Valor de propiedad de Sintaxis. Este vínculo a la página de enumeración, donde puede detectar las constantes con nombre para esa enumeración.

Las enumeraciones pueden marcarse, lo que significa que se atribuyen a FlagsAttribute. Si necesitas especificar una combinación de valores para una enumeración flagwise como un valor de atributo XAML, usa el nombre de cada constante de enumeración, con una coma (,) entre cada nombre y sin caracteres de espacio intermedios. Los atributos flagwise no son comunes en el vocabulario XAML de Windows Runtime, pero ManipulationModes es un ejemplo en el que se admite la configuración de un valor de enumeración flagwise en XAML.

Interfaces en XAML

En raras ocasiones, verás una sintaxis XAML donde el tipo de una propiedad es una interfaz. En el sistema de tipos XAML, un tipo que implementa esa interfaz es aceptable como un valor cuando se analiza. Debe haber una instancia creada de este tipo disponible para servir como valor. Verás una interfaz que se usa como un tipo en la sintaxis XAML para las propiedades Command y CommandParameter de ButtonBase. Estas propiedades admiten patrones de diseño Model-View-ViewModel (MVVM) donde la interfaz ICommand es el contrato para cómo interactúan las vistas y los modelos.

Convenciones de marcador de posición XAML en la referencia de Windows Runtime

Si has examinado cualquiera de los temas de referencia de la sección Sintaxis de las API de Windows Runtime que pueden usar XAML, probablemente hayas visto que la sintaxis incluye bastantes marcadores de posición. La sintaxis XAML es diferente de la sintaxis de componentes de C#, Microsoft Visual Basic o Visual C++ (C++/CX) porque la sintaxis XAML es una sintaxis de uso. Se sugiere el uso final en sus propios archivos XAML, pero sin ser demasiado prescriptivo sobre los valores que puede usar. Por lo general, el uso describe un tipo de gramática que combina literales y marcadores de posición, y define algunos de los marcadores de posición de la sección Valores XAML.

Cuando vea nombres de tipo o nombres de elementos en una sintaxis XAML para una propiedad, el nombre que se muestra es para el tipo que define originalmente la propiedad. Pero XAML de Windows Runtime admite un modelo de herencia de clases para las clases basadas en DependencyObject. Por lo tanto, a menudo puede usar un atributo en una clase que no sea literalmente la clase de definición, sino que se deriva de una clase que primero definió la propiedad o atributo. Por ejemplo, puede establecer Visibility como atributo en cualquier clase derivada UIElement mediante una herencia profunda. Por ejemplo: <Button Visibility="Visible" />. Por lo tanto, no tome el nombre del elemento que se muestra en ninguna sintaxis de uso xaml demasiado literalmente; la sintaxis puede ser viable para los elementos que representan esa clase y también los elementos que representan una clase derivada. En los casos en los que es poco frecuente o imposible que el tipo que se muestre como elemento de definición esté en un uso real, ese nombre de tipo se reduce deliberadamente en la sintaxis. Por ejemplo, la sintaxis que ve para UIElement.Visibility es :

<uiElement Visibility="Visible"/>
-or-
<uiElement Visibility="Collapsed"/>

Muchas secciones de sintaxis XAML incluyen marcadores de posición en la sección "Uso" que luego se definen en una sección Valores XAML que se encuentra directamente en la sección Sintaxis .

Las secciones de uso de XAML también usan varios marcadores de posición generalizados. Estos marcadores de posición no se vuelven a definir cada vez en valores XAML, ya que adivinarás o, finalmente, aprenderás lo que representan. Creemos que la mayoría de los lectores se cansan de verlos en valores XAML de nuevo y otra vez, por lo que los dejamos fuera de las definiciones. Por referencia, esta es una lista de algunos de estos marcadores de posición y lo que significan en un sentido general:

  • object: teóricamente cualquier valor de objeto, pero a menudo prácticamente limitado a determinados tipos de objetos, como una opción de cadena o objeto, y debe comprobar los comentarios en la página de referencia para obtener más información.
  • propiedad object: la propiedad de objeto en combinación se usa para los casos en los que la sintaxis que se muestra es la sintaxis de un tipo que se puede usar como valor de atributo para muchas propiedades. Por ejemplo, el uso de atributos xaml que se muestra para Brush incluye: <object property="predefinedColorName"/>
  • eventhandler: aparece como el valor de atributo para cada sintaxis XAML que se muestra para un atributo de evento. Lo que se proporciona aquí es el nombre de la función para una función de controlador de eventos. Esa función debe definirse en el código subyacente de la página XAML. En el nivel de programación, esa función debe coincidir con la firma de delegado del evento que controla o el código de la aplicación no se compilará. Pero eso es realmente una consideración de programación, no una consideración xaml, por lo que no tratamos de sugerir nada sobre el tipo delegado en la sintaxis XAML. Si desea saber qué delegado debe implementar para un evento, se encuentra en la sección Información del evento del tema de referencia del evento, en una fila de tabla con la etiqueta Delegate.
  • enumMemberName: se muestra en sintaxis de atributo para todas las enumeraciones. Hay un marcador de posición similar para las propiedades que usan un valor de enumeración, pero normalmente prefijos el marcador de posición con una sugerencia del nombre de la enumeración. Por ejemplo, la sintaxis mostrada para FrameworkElement.FlowDirection es <frameworkElementFlowDirection="flowDirectionMemberName"/>. Si está en una de esas páginas de referencia de propiedades, haga clic en el vínculo al tipo de enumeración que aparece en la sección Valor de propiedad, junto al texto Type:. Para el valor de atributo de una propiedad que usa esa enumeración, puede usar cualquier cadena que aparezca en la columna Miembro de la lista Miembros .
  • double, int, string, bool: estos son tipos primitivos conocidos para el lenguaje XAML. Si va a programar con C# o Visual Basic, estos tipos se proyectan en tipos equivalentes de Microsoft .NET, como Double, Int32, String y Boolean, y puede usar cualquier miembro de esos tipos de .NET cuando trabaje con los valores definidos por XAML en el código subyacente de .NET. Si va a programar con C++/CX, usará los tipos primitivos de C++, pero también puede considerar estos tipos equivalentes a los definidos por el espacio de nombres Platform, por ejemplo Platform::String. A veces habrá restricciones de valor adicionales para determinadas propiedades. Pero normalmente los verás en una sección Valor de propiedad o en una sección Comentarios y no en una sección XAML, ya que estas restricciones se aplican tanto a los usos de código como a los usos de XAML.

Sugerencias y trucos, notas sobre el estilo

  • Las extensiones de marcado en general se describen en la información general de XAML principal. Pero la extensión de marcado que afecta a la mayoría de las instrucciones indicadas en este tema es la extensión de marcado StaticResource (y ThemeResource relacionada). La función de la extensión de marcado StaticResource es habilitar la factorización de XAML en recursos reutilizables procedentes de un ResourceDictionary XAML. Casi siempre define plantillas de control y estilos relacionados en resourceDictionary. A menudo se definen las partes más pequeñas de una definición de plantilla de control o un estilo específico de la aplicación en un ResourceDictionary, por ejemplo, solidColorBrush para un color que la aplicación usa más de una vez para diferentes partes de la interfaz de usuario. Mediante el uso de StaticResource, cualquier propiedad que requiera de otro modo un uso de elemento de propiedad para establecer ahora se puede establecer en la sintaxis de atributo. Pero las ventajas de factorizar XAML para reutilizar van más allá de simplificar la sintaxis de nivel de página. Para obtener más información, consulta Referencias de recursos XAML y ResourceDictionary.
  • Verás varias convenciones diferentes sobre cómo se aplican los espacios en blanco y las fuentes de línea en ejemplos xaml. En concreto, hay diferentes convenciones para dividir los elementos de objeto que tienen muchos atributos diferentes establecidos. Es cuestión de estilo. El editor XML de Visual Studio aplica algunas reglas de estilo predeterminadas al editar XAML, pero puedes cambiarlas en la configuración. Hay un pequeño número de casos en los que el espacio en blanco de un archivo XAML se considera significativo; para obtener más información, consulta XAML y espacios en blanco.