Вы находитесь на странице: 1из 13

¿Qué es XAML?

XAML es un lenguaje declarativo de marcado. Tal y como se aplica al modelo de


programación de .NET Framework, XAML IU simplifica la creación de un para una
aplicación .NET Framework. Puede crear elementos visibles IU en el marcado
XAML declarativo y, a continuación IU, separar la definición de la lógica de tiempo
de ejecución utilizando archivos de código subyacente que se unen al marcado
mediante definiciones de clases parciales. XAML representa directamente la
creación de instancias de objetos en un conjunto concreto de tipos de respaldo
definidos en ensamblados. 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. El código XAML habilita un flujo de trabajo en el que
las partes independientes pueden funcionar en la IU y la lógica de una aplicación,
a través de herramientas potencialmente diferentes.
Conceptos básicos de XAML
En esta lección se describe la sintaxis básica de XAML - eXtensible Application
Markup Language - (Lenguaje de marcado de aplicaciones extensible) que permite
a los desarrolladores definir interfaces de usuario en aplicaciones Xamarin.Forms
utilizando lenguaje declarativo XAML en lugar de lenguaje imperativo C#.
Esta lección describe el uso de las extensiones de marcado que extienden el
poder de XAML y se muestra que, aunque no es obligatorio el uso de XAML en
una aplicación Xamarin.Forms, suele ser más conciso y visualmente más
coherente que el código equivalente en C#.
XAML es un lenguaje basado en XML creado por Microsoft como una alternativa al
código de programación imperativo para poder crear objetos, inicializarlos y
organizarlos en jerarquías de padres e hijos. XAML ha sido adaptado a diversas
tecnologías del .NET Framework principalmente en Windows Presentation
Foundation (WPF) donde XAML es utilizado para definir el diseño de interfaces de
usuario. XAML también ha sido adaptado a Silverlight, Windows Runtime, la
Plataforma Universal de Windows (UWP) y Xamarin.Forms.
En el archivo XAML, el desarrollador de Xamarin.Forms puede definir interfaces de
usuario utilizando Controles (Views), Diseños (Layouts), Páginas (Pages) o clases
personalizadas.
VENTAJAS Y DESVENTAJAS
(LEER DIAPOSITIVA)
Controles de XAML
(leer diapositiva) definición
(leer cuaderno)controles
Las vistas son objetos de interfaz de usuario, como etiquetas, botones y los
controles deslizantes que se conocen normalmente como controles o widgets en
otros entornos de programación de gráficos. Las vistas compatibles con
Xamarin.Forms todos se derivan los View clase.
A todas las vistas que se definen en Xamarin. Forms se puede hacer referencia
desde archivos XAML.

EVENTOS
(leer diapositiva)

XAML:

Eventos en XAML
La mayoría de los marcos (frameworks) de UI modernos al igual que WPF, están
impulsados por eventos. Todos los controles, incluida la ventana (Window) (que
también hereda la clase control) exponen un rango de eventos a los que puede
suscribirse. Usted puede suscribirse a estos eventos, lo que significa que su
aplicación será notificada cuando ocurran y podrá entonces reaccionar a ellos.

Hay muchos tipos de eventos, pero algunos de los más comúnmente utilizados
están hechos para responder a la interacción del usuario con su aplicación, con el
ratón o el teclado. En la mayoría de los controles se encuentran eventos como
KeyDown, KeyUp, MouseDown, MouseEnter, MouseLeave, MouseUp y varios otros.

Examinaremos más de cerca cómo funcionan los eventos en WPF, ya que este es
un tema complejo, pero por ahora, debe saber cómo vincular un evento de control
en XAML con un fragmento de código en su archivo de código subyacente (Code-
behind). Echa un vistazo a este ejemplo:
Download & run this example
<Window x:Class="WpfTutorialSamples.XAML.EventsSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="EventsSample" Height="300" Width="300">
<Grid Name="pnlMainGrid" MouseUp="pnlMainGrid_MouseUp"
Background="LightBlue">

</Grid>
</Window>

Observe cómo nos hemos suscrito al evento MouseUp del Grid escribiendo un
nombre de método. Este método debe definirse en código subyacente (code-
behind), utilizando la firma de eventos correcta. En este caso debería verse así:

private void pnlMainGrid_MouseUp(object sender, MouseButtonEventArgs e)


{
MessageBox.Show("You clicked me at " +
e.GetPosition(this).ToString());
}

El evento MouseUp utiliza un delegado llamado MouseButtonEventHandler, al


que debe suscribirse. Tiene dos parámetros, un emisor (el control que causó el
evento) y un objeto MouseButtonEventArgs que contendrá información útil. Lo
utilizamos en este ejemplo para obtener la posición del cursor y notificar al usuario.

Varios eventos pueden utilizar el mismo tipo de delegado - por ejemplo, MouseUp
y MouseDown utilizan MouseButtonEventHandler, mientras que el evento
MouseMove utiliza el delegado MouseEventHandler. Cuando se define el método
de gestión del evento, se necesita saber que delegado utiliza. Si se desconoce, se
puede buscar en la documentación.

Afortunadamente, Visual Studio nos ayuda generando el gestor del evento. La


manera más fácil para realizar esto es simplemente escribir el nombre del evento
en XAML y dejar que el IntelliSense de VS haga el resto por tí:

Make correction
Al seleccionar <New Event Handler> Visual Studio generará un gestor de evento
apropiado en el código subyacente (Code-behind). El nombre seguirá la estructura
de <control name>_<event name>, en nuestro caso pnlMainGrid_MouseDown.
Realizar click-Derecho en el nombre del evento y seleccionar Navegar al Evento te
llevara directamente a él.

1
Checked
Se activa cuando se marca un ToggleButton. (Se hereda de ToggleButton)

2
Click
Se produce cuando se hace clic en un control de botón. (Se hereda de ButtonBase)

3
ContextMenuClosing
Se produce justo antes de que se cierre cualquier menú contextual en el elemento. (Se
hereda de FrameworkElement).

4
ContextMenuOpening
Se produce cuando se abre cualquier menú contextual en el elemento. (Se hereda de
FrameworkElement).

5
DataContextChanged
Se produce cuando cambia el valor de la propiedad FrameworkElement.DataContext. (Se
hereda de FrameworkElement)

6
DragEnter
Se produce cuando el sistema de entrada informa un evento de arrastre subyacente con
este elemento como destino. (Se hereda de UIElement).

7
DragLeave
Se produce cuando el sistema de entrada informa un evento de arrastre subyacente con
este elemento como origen. (Se hereda de UIElement)

8
DragOver
Se produce cuando el sistema de entrada informa un evento de arrastre subyacente con
este elemento como el objetivo de caída potencial. (Se hereda de UIElement)

9
DragStarting
Se produce cuando se inicia una operación de arrastre. (Se hereda de UIElement)

1
DropCompleted
0
Se produce cuando finaliza una operación de arrastrar y soltar. (Se hereda de UIElement)

1
DropDownClosed
1
Se produce cuando se cierra la parte desplegable de ComboBox.

1
DropDownOpened
2
Se produce cuando se abre la parte desplegable de ComboBox.

1
GotFocus
3
Se produce cuando un elemento UIE recibe foco. (Se hereda de UIElement)

1
Holding
4
Se produce cuando se produce una interacción Hold sin control sobre el área de prueba de
impacto de este elemento. (Se hereda de UIElement)

1
Intermediate
5
Se activa cuando el estado de un ToggleButton se cambia al estado indeterminado. (Se
hereda de ToggleButton)

1
IsEnabledChanged
6
Se produce cuando cambia la propiedad IsEnabled. (Se hereda de Control)

1
KeyDown
7
Se produce cuando se presiona una tecla del teclado mientras el elemento UIE tiene el
foco. (Se hereda de UIElement)

1
KeyUp
8
Se produce cuando se suelta una tecla del teclado mientras el UIElement tiene el foco. (Se
hereda de UIElement)

1
LostFocus
9
Se produce cuando un elemento UIE pierde el foco. (Se hereda de UIElement)

2
ManipulationCompleted
0
Se produce cuando se completa una manipulación en el UIElement. (Se hereda de
UIElement)

CODE BEHIND

El código subyacente es un término que se usa para describir el código que se une
con objetos definidos por el marcado XAML cuando una página está compilada
por marcado. En este tema se describen los requisitos para el código subyacente,
así como un mecanismo de código en línea XAMLalternativo para el código de.

Este tema contiene las siguientes secciones:

Código subyacente y lenguaje XAML

El lenguaje XAML incluye características de nivel de lenguaje que permiten asociar


archivos de código con archivos de marcado, desde el lado del archivo de
marcado. En concreto, el lenguaje XAML define las características de
lenguaje X:Class Directive, la Directiva X:Subclassy la Directiva x:ClassModifier
(. Exactamente cómo se debe generar el código y cómo integrar el marcado y el
código, no es parte de lo que especifica el lenguaje XAML. Se deja en marcos como
WPF para determinar cómo integrar el código, cómo usar XAML en los modelos de
aplicación y programación, y las acciones de compilación u otra compatibilidad que
todo esto requiere.

Código subyacente, controladores de eventos y requisitos de clase parcial en


WPF

 La clase parcial debe derivar del tipo que respalda el elemento raíz.

 Tenga en cuenta que en el comportamiento predeterminado de las acciones


de compilación de la compilación de marcado, puede dejar la derivación en
blanco en la definición de clase parcial en el lado del código subyacente. El
resultado compilado asumirá que el tipo de respaldo de la raíz de la página es
la base para la clase parcial, aunque no se haya especificado. Sin embargo, no
se recomienda confiar en este comportamiento.

 Los controladores de eventos que escriba en el código subyacente deben


ser métodos de instancia y no pueden ser métodos estáticos. Estos métodos
deben definirse mediante la clase parcial dentro del espacio de nombres
CLR x:Classidentificado por. No se puede calificar el nombre de un
controlador de eventos XAML para indicar a un procesador que busque un
controlador de eventos para la conexión de eventos en un ámbito de clase
diferente.

 El controlador debe coincidir con el delegado para el evento adecuado en el


sistema de tipos de respaldo.

 Para el lenguaje Microsoft Visual Basic específicamente, puede usar la


palabra clave específica Handles del lenguaje para asociar controladores a
instancias y eventos en la declaración del controlador, en lugar de adjuntar
controladores con atributos en. XAML Sin embargo, esta técnica tiene algunas
limitaciones, ya Handles que la palabra clave no admite todas las
características específicas WPF del sistema de eventos, como ciertos
escenarios de eventos enrutados o eventos adjuntos. Para obtener más
información, vea control de eventos de Visual Basic y WPF.

x:Code

x:Code es un elemento de directiva definido XAMLen. Un x:Code elemento de


Directiva puede contener código de programación en línea. El código
definido XAML en línea puede interactuar con en la misma página. En el ejemplo
siguiente se muestra el C# código en línea. Observe que el código está dentro
del x:Code elemento y que el código debe estar rodeado
por <CDATA[... XAMLXAML XML WPF para escapar el contenido de XML, de modo
que un procesador (que interprete el esquema o el esquema) no intente interpretar
el contenido literalmente como. ]]>

XAMLCopiar

<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="MyNamespace.MyCanvasCodeInline"
>
<Button Name="button1" Click="Clicked">Click Me!</Button>
<x:Code><![CDATA[
void Clicked(object sender, RoutedEventArgs e)
{
button1.Content = "Hello World";
}
]]></x:Code>
</Page>
Limitaciones de código en línea

Considere la posibilidad de evitar o limitar el uso de código en línea. En lo que se


refiere a la arquitectura y la filosofía de codificación, mantener una separación
entre el marcado y el código subyacente mantiene el diseñador y los roles de
desarrollador mucho más distintos. En un nivel más técnico, el código que se
escribe para el código en línea puede resultar complicado de escribir, porque
siempre se escribe en la XAML clase parcial generada y solo puede usar las
asignaciones de espacio de nombres XML predeterminadas. Dado que no
puede using agregar instrucciones, debe calificar totalmente muchas de las
llamadas API que realice. Entre las WPF asignaciones predeterminadas se
encuentran la mayoría de los espacios de nombres CLR que WPF se encuentran en
los ensamblados, pero no todos ellos; tendrá que calificar totalmente las llamadas a
los tipos y miembros incluidos en los otros espacios de nombres CLR. Tampoco se
puede definir nada más allá de la clase parcial en el código insertado y todas las
entidades de código de usuario a las que se hace referencia deben existir como
miembro o variable dentro de la clase parcial generada. Otras características de
programación específicas del lenguaje, como macros #ifdef o variables globales o
variables de compilación, tampoco están disponibles. 

DICCIONARIO DE RECURSOS
Ofrece una implementación de diccionario o tabla hash que contiene recursos de
WPF que usados por los componentes y otros elementos de una aplicación para
WPF.
C#Copiar

[System.Windows.Localizability(System.Windows.LocalizationCategory.Ignore)]
[System.Windows.Markup.Ambient]
[System.Windows.Markup.UsableDuringInitialization(true)]
public class ResourceDictionary : System.Collections.IDictionary,
System.ComponentModel.ISupportInitialize, System.Windows.Markup.INameScope,
System.Windows.Markup.IUriContext
Herencia

Object

ResourceDictionary

Derivado

DesignerStylesDictionary

Atributos

LocalizabilityAttribute AmbientAttribute UsableDuringInitializationAttribute

Implementaciones

ICollection IDictionary IEnumerable ISupportInitialize INameScope IUriContext

Comentarios

Los elementos de un ResourceDictionary no se procesan inmediatamente cuando


un XAMLcargador carga el código de aplicación. En su lugar, ResourceDictionary se
conserva como un objeto y los valores individuales solo se procesan cuando se
solicitan específicamente.

La ResourceDictionary clase no se deriva de DictionaryBase. En su


lugar, ResourceDictionary la clase IDictionary implementa Hashtable pero se basa
en internamente.

En Lenguaje XAML (Extensible Application Markup Language),


la ResourceDictionary clase suele ser un elemento de colección implícito que es el
valor del elemento de Resources objeto de varias propiedades, cuando se especifica
en la sintaxis de elementos de propiedad. Para obtener más información sobre
las XAMLcolecciones implícitas en, vea la Sintaxis de XAML en detalle. Una
excepción es cuando desea especificar un diccionario combinado; para obtener
más información, consulte diccionarios de recursos combinados.

Otro uso XAML posible es declarar un diccionario de recursos como


un XAML archivo discreto y cargarlo en tiempo de ejecución con Load o incluirlo en
un proyecto (de plena confianza) como un recurso o un archivo dinámico. En este
caso, ResourceDictionary se puede declarar como un elemento XAMLde objeto,
que actúa como el elemento raíz de. Debe asignar los valores de espacio de
nombres XML adecuados (valor WPF predeterminado para el x: espacio
de XAML nombres y normalmente para ResourceDictionary el espacio de nombres)
en el elemento si tiene previsto usarlo como el elemento raíz. A continuación,
puede agregar elementos secundarios que definen los recursos, cada uno con un
valor x:Key .

Uso de colecciones implícitas XAML


Copiar

<object>
<object.resourcesProperty>
oneOrMoreResources
</object.resourcesProperty>
</object>
Valores XAML

resourcesProperty
Propiedad que especifica un elemento de propiedad, donde el tipo de valor de esa
propiedad ResourceDictionaryes. Normalmente, esta es la Resources propiedad
de FrameworkElement o FrameworkContentElement, o de Application en un caso
de recursos de la aplicación.

oneOrMoreResources
Uno o varios recursos especificados como elementos de objeto. Cada recurso que
especifique debe tener una Directiva x:Key asignada.

Constructores

ResourceDictionary() Inicializa una nueva instancia de la clase ResourceDictionary.

Propiedades

Count Obtiene el número de entradas del


objeto ResourceDictionary base.
DeferrableContent Obtiene o establece el contenido aplazable de este diccionario de
recursos.

InvalidatesImplicitDataTemplateResources Obtiene o establece un valor que indica si las invalidaciones


desencadenadas por el objeto ResourceDictionary causan que los
objetos ContentPresentervuelvan a evaluar su elección de
plantilla. Las invalidaciones se producen cuando cambia un
recurso de una plantilla de datos implícita.

IsFixedSize Obtiene un valor que indica si este ResourceDictionary es de


tamaño fijo.

IsReadOnly Obtiene un valor que indica si ResourceDictionary es de sólo


lectura.

Item[Object] Obtiene o establece el valor asociado a la clave dada.

Keys Obtiene una colección de todas las claves contenidas


en ResourceDictionary.

MergedDictionaries Obtiene una colección de los


diccionarios ResourceDictionary que constituyen los diversos
diccionarios de recursos en los diccionarios combinados.

Source Obtiene o establece el identificador de recursos uniforme


(URI) del que se cargan los recursos.

Values Obtiene una colección de todos los valores asociados a claves


contenidos en ResourceDictionary.

Métodos

Add(Object, Object) Agrega un recurso por clave a este ResourceDictionary.

BeginInit() Comienza la fase de la inicialización para ResourceDictionary.

Clear() Borra todas las claves (y valores) en el objeto ResourceDictionary base. Esto


no borra ningún elemento de diccionario combinado.
Contains(Object) Determina si ResourceDictionary contiene un elemento con la clave
especificada.

CopyTo(DictionaryEntry[], Copia los elementos de ResourceDictionary a un


Int32) objeto DictionaryEntryunidimensional en el índice especificado.

EndInit() Finaliza la fase de la inicialización e invalida el árbol anterior para que se


pueda responder de todos los cambios realizados a las claves durante la fase
de inicialización.

Equals(Object) Determina si el objeto especificado es igual al objeto actual.


(Inherited from Object)

FindName(String) No admitido por la implementación de este diccionario.

GetEnumerator() Devuelve un IDictionaryEnumerator que se puede usar para


iterar ResourceDictionary.

GetHashCode() Sirve como la función hash predeterminada.


(Inherited from Object)

GetType() Obtiene el Type de la instancia actual.


(Inherited from Object)

MemberwiseClone() Crea una copia superficial del objeto Object actual.


(Inherited from Object)

OnGettingValue(Object, Se produce cuando ResourceDictionary recibe una solicitud de un recurso.


Object, Boolean)

RegisterName(String, Object) No admitido por la implementación de este diccionario.

Remove(Object) Quita la entrada con la clave especificada del diccionario base.


ToString() Devuelve una cadena que representa el objeto actual.
(Inherited from Object)

UnregisterName(String) No admitido por la implementación de este diccionario.

Implementaciones de interfaz explícitas

ICollection.CopyTo(Array, Para obtener una descripción de este miembro, vea CopyTo(Array, Int32).


Int32)

ICollection.IsSynchronized Para una descripción de este miembro, vea IsSynchronized.

ICollection.SyncRoot Para obtener una descripción de este miembro, vea SyncRoot.

IEnumerable.GetEnumerator() Para una descripción de este miembro, vea GetEnumerator().

IUriContext.BaseUri Para una descripción de este miembro, vea BaseUri.

Métodos de extensión

Cast<TResult>(IEnumerable) Convierte los elementos de IEnumerable en el tipo especificado.

OfType<TResult>(IEnumerable Filtra los elementos de IEnumerable en función de un tipo especificado.


)

AsParallel(IEnumerable) Habilita la paralelización de una consulta.

AsQueryable(IEnumerable) Convierte una interfaz IEnumerable en IQueryable.

Вам также может понравиться