Capítulo 1: Modelo de aplicación "Longhorn"
Capítulo 1: Modelo de aplicación "Longhorn"
Brent Rector
Wise Owl Consulting
Octubre de 2003
Contenido
Características del modelo de aplicación "Longhorn"
La clase Application
La clase NavigationApplication
Lenguaje XAML (Extensible Application Markup Language)
Resumen
¿Por qué necesitamos un nuevo modelo de aplicación? Una de las principales razones es salvar la brecha entre desarrollar una aplicación para Microsoft® Windows® y desarrollar una aplicación para la Web.
Hoy en día, al escribir una aplicación de Windows, puede aprovechar las características de Windows. La aplicación puede proporcionar una interfaz de usuario enriquecida y con capacidad de respuesta. Puede instalar la aplicación en el equipo cliente, lo que permite que la aplicación se ejecute sin conexión, sin una conexión de red. Las aplicaciones windows pueden aprovechar las funcionalidades de hardware del equipo cliente.
Sin embargo, las aplicaciones tradicionales de Windows también tienen una serie de inconvenientes. Normalmente, debe instalar una aplicación de Windows. Esto dificulta la implementación de la aplicación y las actualizaciones. Las aplicaciones de Windows no se ejecutan en el explorador. Por lo tanto, los paradigmas conocidos de la interfaz de usuario web, como las aplicaciones orientadas a páginas, la navegación directamente desde una página a otra, el historial de páginas y mucho más no están disponibles para la aplicación a menos que las cree desde cero. Las aplicaciones de Windows tampoco admiten texto muy bien, especialmente cuando se intenta mezclar texto y gráficos en la misma página. Crear una aplicación de Windows que fluya automáticamente el texto alrededor de los gráficos y que responda a los cambios iniciados por el usuario en el tamaño de la ventana y las preferencias del usuario para fuentes y legibilidad es una gran cantidad de trabajo.
Las aplicaciones web también tienen sus propios puntos fuertes. Cuando se navega a una página web, el explorador solo descarga esa página y los componentes que requiere la página. Al navegar a una nueva página, el explorador descarga los requisitos de la nueva página. En otras palabras, el explorador descarga progresivamente la aplicación según sea necesario.
La implementación de una aplicación web es trivial. ¿Qué implementación? Coloca los componentes de aplicación necesarios en un servidor y el explorador los descarga según sea necesario. No hay ninguna implementación por se.
La creación de la interfaz de usuario para una aplicación web también es bastante fácil. Declara sus intenciones mediante marcado. Por ejemplo, supongamos que quiero una tabla en una posición específica. Quiero que una imagen siga la tabla. Quiero que un texto fluya alrededor de la imagen. Mezclar texto, gráficos y multimedia (sonido y vídeo) en una aplicación web es sencillo.
Por supuesto, las aplicaciones web también tienen sus puntos incorrectos. No se puede instalar una aplicación web en el sistema de escritorio; por lo tanto, la aplicación no se puede ejecutar sin conexión. Siempre debe tener una conexión con el servidor. Ciertas operaciones de aplicación requieren recorridos de ida y vuelta al servidor y que reducen el rendimiento. Una selección de aplicaciones web de controles es bastante primitiva en comparación con los controles de Windows disponibles. Por lo tanto, una aplicación web suele tener una interactividad deficiente. También es difícil desarrollar una interfaz de usuario atractiva para una aplicación web porque debe expresar cualquier diseño no trivial mediante tablas.
Actualmente, los desarrolladores que diseñan nuevas aplicaciones deben tomar una decisión inicial, enorme e irreversible: ¿la aplicación debe ser una aplicación de estilo web o una aplicación clásica de Microsoft Win32®? Se necesitan modelos de programación completamente independientes (y aptitudes). En función del modelo de aplicación que elija.
"Longhorn" le permite desarrollar aplicaciones con lo mejor de ambos mundos. El modelo de aplicación "Longhorn" toma las mejores características de las aplicaciones web y las mejores características de las aplicaciones de Windows y las combina en un único modelo de programación unificado basado en código administrado.
Una segunda razón principal para desarrollar un nuevo modelo de aplicación es proporcionar un único modelo de programación que pueda crear la amplia variedad de "aplicaciones" que se usan hoy en día. Mira uno de tus sitios web favoritos, como CNN o MSNBC. ¿El sitio web es una aplicación tradicional? ¿Es un documento? ¿Es una presentación multimedia? En muchos casos, la respuesta es sí a las tres preguntas.
Cuando un sitio web incluye elementos de interfaz de usuario como cuadros de lista, controles de edición y botones de radio, parece que una aplicación presenta una interfaz de usuario. Sin embargo, cuando muestra imágenes y texto que fluyen alrededor de las imágenes, el sitio web es similar a un documento. Cuando presenta contenido flash, gráficos, audio, vídeo y animación, el sitio web parece ser una presentación multimedia.
Por supuesto, estos sitios web enriquecidos son difíciles de desarrollar. Debe aplicar revisiones a una descripción basada en marcado HTML de la página, con controles Microsoft ActiveX® para una interfaz de usuario enriquecida, con animaciones flash insertadas y posiblemente con formato de documento portátil (PDF) para la compatibilidad con documentos. Todas estas tecnologías usan una arquitectura diferente, proporcionan diferentes características de rendimiento y requieren diferentes modelos y herramientas de programación.
Normalmente, esto significa que debe contratar a varios desarrolladores con diferentes conjuntos de aptitudes para desarrollar cada parte de la aplicación. A continuación, los desarrolladores deben combinar los distintos modelos en una sola aplicación de trabajo. El desarrollo de la aplicación es lo suficientemente difícil. La depuración suele ser una pesadilla.
"Longhorn" proporciona una arquitectura unificada que admite estos tres niveles: documentos, aplicaciones y medios. ¿Desea crear la interfaz de usuario mediante declaración mediante marcado? Ve por eso. ¿Necesita usar controles enriquecidos de Windows? ¡Entonces hazlo! ¿Desea escribir controladores de eventos en un lenguaje administrado fuertemente tipado? También puedes hacerlo. ¿Desea mezclar texto, gráficos y vídeos en un documento con diseño inteligente y presentación según las preferencias del usuario y optimizadas para la mejor visualización y lectura en el sistema cliente? Pues tengo una noticia. Tú también lo consigues.
El modelo de aplicación "Longhorn" permite escribir una aplicación mediante un único modelo de programación que admita la funcionalidad de interfaz de usuario de estilo de aplicación, la presentación de estilo de documento de texto y gráficos, y la integración de varios medios. Además, puede crear la interfaz de usuario mediante marcado como una aplicación web. También obtendrá la facilidad de implementación (o falta de implementación) de una aplicación web. Sin embargo, todavía tiene el rendimiento y la capacidad de instalar la aplicación para su uso sin conexión, como una aplicación de Windows. La aplicación se puede ejecutar como una aplicación independiente o hospedada en un explorador web simplemente recompilando una base de código fuente. En cualquier caso, la aplicación puede basarse en formularios, como muchas aplicaciones tradicionales de Windows o basadas en páginas, como aplicaciones web.
Características del modelo de aplicación "Longhorn"
El modelo de aplicación "Longhorn" define lo que es una aplicación:
- Sus puntos de entrada
- Su flujo de control: cómo navegar de una página a otra
- Su estado compartido y sus recursos
- Eventos para toda la aplicación
- Su aislamiento de otras aplicaciones
El modelo de aplicación "Longhorn" define cómo implementar y mantener una aplicación:
- Implementación como uno o varios archivos
- Actualización, reversión y administración
El modelo de aplicación "Longhorn" define la experiencia del usuario con la aplicación:
- Instalación de impacto cero
- Independiente (estilo de Windows) o integrada en el explorador
- Se ejecuta en línea o sin conexión
- Modelo de navegación
Aplicaciones web "Longhorn"
El modelo de aplicación "Longhorn" le permite escribir una aplicación enriquecida de forma similar a la forma en que escribe las aplicaciones web de hoy en día. Esto proporciona una ruta de migración sencilla para los desarrolladores web, ya que el código que escribe es similar al código de las páginas web HTML dinámicas (DHTML). Pueden (orden aleatorio) colocar el marcado y el script en el mismo archivo. Pueden implementar los archivos de la aplicación en un servidor web. Las páginas de aplicación se ejecutan en el explorador web.
Sin embargo, el modelo de objetos para una aplicación de estilo web "Longhorn" es mucho más sencillo y mucho más eficaz que DHTML. El código de aplicación puede usar la capa de presentación "Longhorn" completa. Por lo tanto, una aplicación web "Longhorn" puede usar controles de cliente enriquecidos, admitir elementos multimedia y gráficos en la página, controlar eventos localmente, básicamente todo lo que podría hacer una aplicación cliente normal. De hecho, una aplicación web "Longhorn" no es muy diferente de una aplicación de escritorio "Longhorn" distinta de la que los archivos residen en un servidor; un explorador normalmente, pero no necesariamente, hospeda la interfaz de usuario; y la aplicación se ejecuta con permisos restringidos porque el usuario no lo ha instalado en el sistema cliente.
Aplicaciones de escritorio "Longhorn"
El modelo de aplicación "Longhorn" también define cómo escribir aplicaciones de escritorio. Una aplicación de escritorio"Longhorn" es una aplicación que el usuario ha instalado localmente. Estas aplicaciones se pueden ejecutar en línea o sin conexión. Estas aplicaciones se pueden registrar con el shell, colocar iconos en el escritorio, agregar accesos directos al menú Inicio, etc.
Una aplicación de escritorio también se puede ejecutar en la ventana del explorador o en una ventana independiente. De hecho, una aplicación de escritorio puede admitir muchas características asociadas tradicionalmente a una aplicación web, incluidas las siguientes:
- Definir explícitamente puntos de entrada externos, es decir, puede iniciarse en cualquier página.
- Compartir el estado entre páginas
- Controlar varios eventos, incluidos los eventos de navegación de página
- Control del flujo de la aplicación
- Agregar o quitar entradas de un historial de páginas/registro de navegación de viajes
- Iniciar ventanas de aplicación
Creación de una aplicación "Longhorn"
Para compilar una aplicación "Longhorn", defina el modelo de objetos de la aplicación. Puedes definir el modelo mediante programación escribiendo código o mediante declaración escribiendo marcado en un lenguaje denominado Lenguaje de marcado de aplicación extensible (XAML). Compile el código o el marcado en uno o varios ensamblados .NET, un archivo de manifiesto de aplicación y un archivo de manifiesto de implementación.
Opcionalmente, puede empaquetar la aplicación en un nuevo formato de archivo, denominado contenedor. Los archivos de aplicación de un contenedor se pueden comprimir, cifrar y firmar digitalmente.
Hablo de compilar una aplicación "Longhorn" en detalle en el capítulo 2, pero por ahora la idea principal es que compilar una aplicación "Longhorn" le proporciona el código de la aplicación, un manifiesto de aplicación que describe todos los componentes que usa la aplicación y un manifiesto de implementación que indica al sistema cómo instalar y mantener la aplicación.
Implementación de una aplicación "Longhorn"
El modelo de aplicación "Longhorn" proporciona una implementación fácil y rentable de la aplicación. En el caso más sencillo, basta con copiar los archivos de aplicación en un servidor. De forma similar, la instalación de la aplicación es sencilla y no afecta.
Una opción es no instalar la aplicación en absoluto. El usuario puede ir al manifiesto de aplicación en un servidor y ejecutarlo. "Longhorn" descarga incrementalmente la aplicación y la ejecuta. No recibe ninguna demanda de confirmación, ningún requisito de reinicio y ningún infierno dll. De hecho, ni siquiera necesita derechos de administrador para instalar o ejecutar la aplicación.
Como alternativa, el usuario puede ir al manifiesto de implementación de la aplicación en el servidor y ejecutarlo. "Longhorn" descarga incrementalmente la aplicación, la instala y la ejecuta. De forma predeterminada, todas las aplicaciones "Longhorn" se ejecutan en un entorno de permisos limitado denominado Entorno de ejecución segura (SEE).
Las aplicaciones que se ejecutan en SEE reciben un conjunto de permisos restringidos que es aproximadamente equivalente a los permisos concedidos a las aplicaciones actuales asociadas a la zona de Internet. Una aplicación que requiere permisos adicionales que "Longhorn" proporciona de forma predeterminada debe solicitar esos permisos adicionales en su manifiesto de aplicación.
La primera vez que el usuario ejecuta esta aplicación, el Administrador de confianza de "Longhorn" evaluará la solicitud de permiso con privilegios elevados, notificará al usuario un nivel de riesgo sugerido asociado con la concesión de la solicitud de permiso de la aplicación y proporcionará una respuesta sugerida para ese nivel de riesgo. Cuando el usuario permite que el Administrador de confianza conceda a la aplicación sus permisos solicitados, el Administrador de confianza registra esta información. Las ejecuciones posteriores de la aplicación instalada continúan sin la advertencia de seguridad.
Hoy, cuando se instala una aplicación localmente, recibe el conjunto de permisos FullTrust simplemente porque se carga desde la zona LocalComputer. La seguridad de acceso de código (CAS) funciona de forma diferente para las aplicaciones "Longhorn". Una aplicación local (o instalada) se ejecuta en la directiva de seguridad del sitio desde el que el usuario lo descargó en lugar de recibir automáticamente FullTrust simplemente porque se instala localmente.
Al cargar una aplicación, sus componentes y sus recursos, "Longhorn" proporciona evidencia al sistema de seguridad de Common Language Runtime (CLR), como
- Zona de Internet y sitio de origen (del identificador uniforme de recursos [URI])
- Nombre del publicador y del módulo (desde el manifiesto de implementación)
A continuación, CAS proporciona la aplicación basada en directivas de seguridad sobre privilegios de acceso en función de la evidencia de la aplicación.
El manifiesto de implementación de una aplicación puede especificar el intervalo de actualización que "Longhorn" debe usar al comprobar una nueva versión de la aplicación. Cuando "Longhorn" detecta que hay disponible una nueva versión, descarga e instala la nueva versión en segundo plano. La próxima vez que el usuario ejecute la aplicación, recibe la nueva versión.
Al instalar una aplicación, "Longhorn" conserva la versión anterior, si existe. Si necesita, puede revertir sin problemas a la versión anterior o incluso desinstalar completamente la aplicación mediante Agregar o quitar programas. Los departamentos de TI pueden insertar la instalación de una aplicación en un sistema cliente para una implementación práctica.
Especifique cómo implementar la aplicación al compilar el proyecto y puede cambiar el escenario de implementación mediante la recompilación, normalmente con pocos o ningún cambio en el código fuente.
El programa de un desarrollador interactúa inicialmente con gran parte de la compatibilidad de aplicaciones "Longhorn" a través de una instancia de la clase MSAvalon.Windows.Application , por lo que vamos a examinar esa clase.
La clase Application
Un programa "Longhorn" siempre contiene una única instancia de un objeto de aplicación. Este objeto deriva directa o indirectamente de la clase MSAvalon.Windows.Application y realiza las siguientes funciones:
- Proporciona un punto de entrada, una encapsulación y un ámbito para la aplicación.
- Permite que una aplicación comparta código y estado entre las páginas que componen la aplicación.
- Proporciona eventos de nivel de aplicación.
- Mantiene una colección de las ventanas de la aplicación.
- Proporciona un modelo de seguridad
- Define los recursos que usa la aplicación.
La clase MSAvalon.Windows.Application proporciona compatibilidad básica con aplicaciones para una aplicación. Normalmente, se usa cuando la aplicación necesita una sobrecarga baja y no usa características de navegación de página. Sin embargo, la mayoría de las aplicaciones de plataforma "Longhorn" usan la clase MSAvalon.Windows.NavigationApplication estrechamente relacionada, que hereda de MSAvalon.Windows.Application y agrega compatibilidad para la navegación. Analizaré la clase NavigationApplication en detalle en la sección siguiente. Normalmente, definirá una clase que hereda la clase base adecuada, invalida los métodos de clase base según sea necesario y, a continuación, se registra para que los eventos proporcionen procedimientos personalizados de inicio o apagado.
La lista de archivos de origen SimpleApplication1.cs, que se muestra aquí, muestra el uso del objeto Application . El método EntryClass.Main crea mi objeto de aplicación especializado, MyApp y llama a su método Run para iniciar la aplicación. La clase MyApp invalida el método OnStartingUp , que recibe el control cuando se inicia la aplicación. Cuando el sistema invoca el método OnStartingUp , llamo a un método auxiliar que crea la ventana principal de la aplicación, agrega texto a la ventana y muestra la ventana.
SimpleApplication1.cs
using System;
using MSAvalon.Windows;
using MSAvalon.Windows.Controls;
using MSAvalon.Windows.Media;
namespace IntroLonghorn {
public class MyApp : MSAvalon.Windows.Application {
MSAvalon.Windows.Controls.SimpleText txtElement;
MSAvalon.Windows.Window mainWindow;
protected override void OnStartingUp (StartingUpCancelEventArgs e) {
base.OnStartingUp (e);
CreateAndShowMainWindow ();
}
private void CreateAndShowMainWindow () {
// Create the application's main window
mainWindow = new MSAvalon.Windows.Window ();
// Add a dark red, 14 point, "Hello World!" text element
txtElement = new MSAvalon.Windows.Controls.SimpleText ();
txtElement.Text = "Hello World!";
txtElement.Foreground = new
MSAvalon.Windows.Media.SolidColorBrush (Colors.DarkRed);
txtElement.FontSize = new FontSize (14,
FontSizeType.Point);
mainWindow.Children.Add (txtElement);
mainWindow.Show ();
}
}
internal sealed class EntryClass {
[System.STAThread]
private static void Main () {
MyApp app = new MyApp ();
app.Run ();
}
}
}
He usado la siguiente línea de comandos para compilar el código fuente SimpleApplication1.cs en una aplicación ejecutable. Es posible que tenga que ajustar las rutas de acceso a los ensamblados a los que se hace referencia.
csc /r:C:\WINDOWS\Microsoft.NET\Windows\v6.0.4030\PresentationCore.dll
/r:C:\WINDOWS\Microsoft.NET\Windows\v6.0.4030\PresentationFramework.dll
/r:C:\WINDOWS\Microsoft.NET\Windows\v6.0.4030\WindowsBase.dll
SimpleApplication1.cs
La clase Application contiene una serie de otras propiedades, métodos y eventos útiles. Por ejemplo, la clase de aplicación puede invalidar el método virtual OnShuttingDown para proporcionar un comportamiento de apagado personalizado. La clase de aplicación también proporciona los eventos StartingUp y ShuttingDown para que otras clases puedan registrarse para las notificaciones de inicio y apagado. El método Shutdown permite iniciar el apagado de la aplicación mediante programación.
Es posible que desee hacer referencia al objeto de aplicación desde varios lugares en el código fuente. Por lo tanto, la clase Application proporciona la propiedad estática Current que devuelve una referencia al objeto de aplicación. El fragmento de código siguiente usa la propiedad Current para buscar el objeto de aplicación y registrarse para una notificación de evento de apagado:
MyApp app = (MyApp) MSAvalon.Windows.Application.Current;
app.ShuttingDown += new
Application.ShuttingDownEventHandler (ShutDownHandler);
§
private static void
ShutDownHandler (object sender, MSAvalon.Windows.ShuttingDownEventArgs e) {
§
}
La clase NavigationApplication
Cuando desee admitir la navegación para la aplicación, normalmente usará la clase MSAvalon.Windows.Navigation.NavigationApplication , que extiende la clase MSAvalon.Windows.Application . Aunque puede crear una aplicación basada en navegación sin usar la clase NavigationApplication , el uso de la clase proporciona las siguientes funcionalidades adicionales para la aplicación:
- Simplifica la escritura de aplicaciones basadas en navegación; no suele ser necesario para subclase la clase
- Determina cuándo hay una conexión disponible
- Proporciona eventos de navegación, como Navigateing, NavigationProcess, Navigated, NavigationError, LoadCompleted y Stopped, que se activan cuando se produce el evento adecuado en cualquiera de las ventanas de la aplicación.
- Estado compartido entre páginas
- Proporciona un contenedor para los valores de propiedad compartidos entre páginas.
- Implementa una directiva que abre una ventana inicial de forma predeterminada.
Externamente, el usuario de una aplicación de navegación solo puede navegar a puntos de entrada bien definidos de la aplicación. Sin embargo, internamente, el desarrollador controla la navegación mediante el enlace de eventos. Puede determinar cuándo una ventana o marco intenta navegar a una nueva página y cuándo se completa la navegación. Puede cancelar o redirigir cualquier navegación. Puede averiguar la identidad de la página de destino. Puede controlar los errores de navegación.
El modelo de navegación familiar facilita el uso de una aplicación. Una aplicación de navegación proporciona un comportamiento similar al web. La aplicación puede usar hipervínculos, proporcionar botones Adelante y Atrás, mostrar una lista favoritos y mantener un historial de páginas. La clase NavigationApplication "Longhorn" y las clases relacionadas proporcionan toda la compatibilidad con estas características.
Una aplicación de navegación funciona tanto en línea como sin conexión, y funciona igual si un explorador hospeda la aplicación o la aplicación se ejecuta como independiente. Además, tiene un control completo sobre este comportamiento web. Puede personalizar la experiencia del usuario según sea necesario. Puede insertar, quitar y modificar entradas de Travelog para controlar dónde van las operaciones Adelante y Atrás. Puede definir qué páginas (puntos de entrada) se registran en el historial.
Normalmente, una aplicación de navegación crea una o varias instancias de la clase MSAvalon.Windows.Navigation.NavigationWindow . La lista SimpleApplication2.cs, que se muestra aquí, muestra un uso de estas clases. Esta lista es la misma que SimpleApplication1.cs, salvo que usa las clases NavigationApplication y NavigationWindow .
SimpleApplication2.cs
using System;
using MSAvalon.Windows;
using MSAvalon.Windows.Controls;
using MSAvalon.Windows.Media;
using MSAvalon.Windows.Navigation;
namespace IntroLonghorn {
public class MyApp : MSAvalon.Windows.Navigation.NavigationApplication {
protected override void OnStartingUp (StartingUpCancelEventArgs e) {
base.OnStartingUp (e);
CreateAndShowMainWindow ();
}
private void CreateAndShowMainWindow () {
// Create the application's main window
mainWindow = new MSAvalon.Windows.Navigation.NavigationWindow ();
// Fill window with appropriate controls
§
// Show the window
mainWindow.Show ();
}
}
internal sealed class EntryClass {
[System.STAThread]
private static void Main () {
MyApp app = new MyApp ();
app.Run ();
}
}
}
El código que ha visto hasta ahora es simplemente otra variación en los modelos de programación tradicionales. El único aspecto nuevo es las clases reales que he usado. Sin embargo, la mayoría de las veces no escribirá mucho de este código. Tomemos un ligero desvío y aprendamos sobre un nuevo lenguaje de programación que le permite escribir este mismo código en un modo mucho más compacto y, al menos, más comprensible.
Lenguaje XAML (Extensible Application Markup Language)
En muchas aplicaciones, gran parte del código que escribe pertenece a la creación y actualización de la interfaz de usuario de la aplicación. De hecho, en los ejemplos anteriores, no había código que no fuera el necesario para crear la interfaz de usuario. En los últimos años, muchos desarrolladores han aprendido a escribir, e incluso a preferir definir, la interfaz de usuario de una aplicación mediante uno de varios lenguajes de marcado disponibles. La plataforma "Longhorn" define un nuevo lenguaje de marcado denominado Lenguaje de marcado extensible de aplicaciones (XAML; pronunciado "Zamel", que rima con "camel").
El uso de un lenguaje de marcado para definir una interfaz de usuario tiene varias ventajas sobre el uso de un lenguaje de programación de procedimientos. Estas ventajas incluyen las siguientes:
- Jerarquías de control más aparentes
- Herencia de propiedades más aparente
- Procesamiento e interpretación más fáciles del lenguaje de marcado por herramientas
- Separación potencial de la interfaz de usuario y el código de procedimientos
Me gusta XAML y prefiero usarlo para definir mis interfaces de usuario en lugar de usar la codificación de tipo de procedimiento que te he mostrado hasta ahora en este capítulo. Sin embargo, no pienses que podrás hacer todo lo que necesitarás usando nada más que XAML.
Tenga en cuenta esta instrucción de la documentación: "Los documentos a menudo se pueden escribir completamente en XAML y mostrarse en el explorador". He señalado que esta frase usa la palabra documentos, no las aplicaciones, y califica la instrucción con el término a menudo. Al escribir un documento que muestra contenido estático, puedes crearlo en XAML puro. Incluso puedes escribir un documento que use el enlace de datos para mostrar y actualizar el contenido de un origen de datos usando nada más que XAML. Puedes definir animaciones y efectos sobre el mouse usando nada más que XAML. Puedes hacer un montón de mucho usando nada más que XAML. (De hecho, intento hacer tanto como sea posible en XAML y lo menos posible en el código. Mis aplicaciones parecen ser menos buggy y funcionan más rápidamente el menos código que escribo!) Sin embargo, para escribir una aplicación de producción, normalmente tendrás que reaccionar a los eventos, proporcionar lógica de decisión personalizada o incluir muchas otras operaciones que no son de interfaz de usuario, por lo que tendrás que mezclar XAML y código. Afortunadamente, esto es muy fácil de hacer.
Describiré los archivos XAML con más profundidad en el capítulo 3; por ahora, echemos un vistazo a un primer plano para XAML:
- Un nombre de elemento XAML es un nombre de clase de .NET Framework. Al definir un elemento XAML, se crea eficazmente una instancia de la clase de .NET Framework con el mismo nombre que el elemento XAML.
- Un nombre de atributo XAML se asigna a la propiedad o campo con el mismo nombre, normalmente en la instancia de clase.
En el programa SimpleApplication1.cs, creo una ventana y agréguele algunos controles mediante el código siguiente:
// Create the application's main window
mainWindow = new MSAvalon.Windows.Window ();
// Add a dark red, 14 point, "Hello World!" text element
txtElement = new MSAvalon.Windows.Controls.SimpleText ();
txtElement.Text = "Hello World!";
txtElement.Foreground = new
MSAvalon.Windows.Media.SolidColorBrush (Colors.DarkRed);
txtElement.FontSize = new FontSize (14, FontSizeType.Point);
mainWindow.Children.Add (txtElement);
mainWindow.Show ();
El siguiente documento XAML genera exactamente esta misma interfaz de usuario.
HelloWorld.xaml
<Window xmlns="https://schemas.microsoft.com/2003/xaml" Visible="true">
<SimpleText Foreground="DarkRed" FontSize="14">Hello World!</SimpleText>
</Window>
El elemento window raíz crea una instancia de una clase denominada MSAvalon.Windows.Window. De algún modo, el sistema de compilación debe saber que el elemento XAML denominado Window hace referencia a una instancia de la clase denominada MSAvalon.Windows.Window. El valor del atributo xmlns proporciona esta asignación.
Los analizadores XML interpretan los nombres de elementos no completos en relación con el espacio de nombres especificado en el atributo de espacio de nombres predeterminado más reciente, en el ámbito, xmlns. Cuando se especifica un valor xmlns de "https://schemas.microsoft.com/2003/xaml", el sistema de compilación interpreta un nombre de elemento no completo en el elemento de definición, o uno de sus elementos subordinados, como el nombre de una clase en un conjunto predefinido de espacios de nombres.
Déjame restar eso en términos más concretos, usando C# como ejemplo. La declaración xmlns agrega eficazmente una serie de instrucciones using al código. A continuación, el sistema de compilación interpreta cada nombre de elemento XAML no completo como un nombre de clase con las declaraciones using que proporcionan el contexto para los posibles espacios de nombres. Aunque la lista puede cambiar, en el momento de redactar este documento, especificar el valor estándar para el atributo de espacio de nombres predeterminado provoca la inclusión de las siguientes instrucciones using :
using MSAvalon.Windows;
using MSAvalon.Windows.Controls;
using MSAvalon.Windows.Controls.Primitives;
using MSAvalon.Windows.Data;
using MSAvalon.Windows.Documents;
using MSAvalon.Windows.Shapes;
using MSAvalon.Windows.Media;
using MSAvalon.Windows.Media.Animation;
using MSAvalon.Windows.Navigation;
La declaración de espacio de nombres predeterminada estándar también hace que el sistema de compilación haga referencia a los ensamblados PresentationFramework y PresentationCore , que contienen clases en los espacios de nombres enumerados anteriormente.
He establecido el atributo Visible del elemento Window en true. Esto corresponde a mi código original que muestra la ventana llamando a su método Show .
He anidado un elemento SimpleText dentro de la definición del elemento Window . Esto indica al sistema que cree una instancia de un objeto MSAvalon.Windows.Controls.SimpleText, que sea un elemento secundario del objeto Window y establezca el valor del objeto de texto simple en la cadena "Hola mundo!".
Guarde el código XAML anterior en un archivo denominado HelloWorld.xaml y ejecute el archivo. El explorador interpretará el código XAML en el archivo y mostrará la interfaz de usuario, como se muestra en la figura 1-1.
Figura 1-1. Explorador que muestra la versión XAML de Hola mundo (haga clic en imagen para ver una imagen más grande).
Es posible que quiera usar una clase de .NET que no esté definida en uno de los espacios de nombres predeterminados enumerados anteriormente. Un ejemplo típico es el uso de una clase de un ensamblado que se crea. El sistema de compilación debe poder asignar el nombre del elemento que especifique en el archivo de origen XAML a la clase .NET adecuada en el ensamblado correcto. XAML define una instrucción de procesamiento XML (PI) denominada ? Asignación que se usa para crear esta asociación.
¿El ? La asignación de PI permite definir un prefijo de espacio de nombres XML que se asigna a un espacio de nombres y ensamblado CLR. Cuando calificas un nombre de elemento XAML con este prefijo de espacio de nombres, indicas al sistema de compilación, en efecto, que tomes el nombre del elemento, agrega el prefijo CLR al nombre y crea una instancia de la clase con el nombre resultante. El compilador hará referencia al ensamblado especificado para que pueda encontrar la definición de la clase .
En el ejemplo siguiente se crea una instancia de la clase WiseOwl.Statistics.PoissonDeviate , cuya definición reside en el ensamblado WiseOwl.Statistics.Library :
<?Mapping XmlNamespace="stat" ClrNamespace="WiseOwl.Statistics"
Assembly="WiseOwl.Statistics.Library" ?>
<Window xmlns="https://schemas.microsoft.com/2003/xaml" Visible="true">
<SimpleText Foreground="DarkRed" FontSize="14">Hello World!</SimpleText>
<stat:PoissonDeviate Mean="5.0" />
</Window>
No puedo destacar suficiente que XAML es simplemente otra manera de generar código que usa las clases de interfaz de usuario de .NET Framework. De hecho, podrías tener una herramienta que muestre gráficamente una especificación de interfaz de usuario XAML mediante un diseñador visual. Otra herramienta podría hacer lo contrario y permitirle diseñar la interfaz de usuario gráficamente y guardarla como un archivo XAML. Sin embargo, otra herramienta podría guardar el diseño de la interfaz de usuario como código de procedimiento, que es similar a cómo funciona el diseñador de WinForms. Todos estos enfoques son solo métodos diferentes para especificar la misma información.
Anteriormente en este capítulo, mencioné que el explorador podría representar un archivo XAML en su ventana. El explorador solo puede hacerlo cuando el archivo XAML no contiene nada más que el marcado, como el ejemplo simple que se acaba de mostrar. A medida que la interfaz de usuario se vuelve más complicada, normalmente tendrás que usar controladores de eventos y otro código fuente sin marca, además del XAML que describe la interfaz de usuario. Cada vez que tenga una base de código fuente mixta (es decir, código fuente de marcado y sin marcación), debe compilar el marcado y el código fuente mediante la utilidad MSBuild. Después de la compilación, puede ejecutar la aplicación como un componente independiente o hacer que el explorador muestre la interfaz de usuario resultante.
Resumen
¡Listo! Ahora comprende los conceptos básicos del nuevo modelo de aplicación. Ha aprendido a usar el marcado para crear una interfaz de usuario mediante declaración, aunque una interfaz de usuario muy sencilla. Podría escribir el equivalente de páginas web mediante archivos XAML e implementar esos archivos en un servidor para que un usuario examine. Sin embargo, los escenarios que son más interesantes normalmente requerirán que compile la aplicación antes de implementarla. Por lo tanto, vamos a entrar y aprender a compilar e implementar una aplicación "Longhorn".
Continúe con el capítulo 2: Creación de una aplicación "Longhorn".
© 2003 Microsoft Corporation. Todos los derechos reservados.
IntelliSense, Microsoft, MSDN, MS-DOS, Visual Basic .NET y Visual Studio .NET son marcas comerciales registradas o marcas comerciales de Microsoft Corporation en los Estados Unidos y/o en otros países. Otros nombres de producto y empresa mencionados aquí pueden ser las marcas comerciales de sus respectivos propietarios.