Beruflich Dokumente
Kultur Dokumente
Qu es Silverlight?
Silverlight permite crear aplicaciones de vanguardia con las siguientes caractersticas:
Es una tecnologa multiplataforma que se ejecuta en varios exploradores. Se ejecuta en todos los
exploradores web conocidos, como Microsoft Internet Explorer, Mozilla Firefox, Apple Safari y
Google Chrome, as como en Microsoft Windows y Apple Mac OS X.
Es una descarga pequea que se instala en pocos segundos.
Transmite los contenidos de audio y vdeo por secuencias. Ajusta el contenido de vdeo a todo tipo
de calidades, desde dispositivos mviles hasta exploradores de escritorio y modos de vdeo HDTV
de 720p.
Incluye grficos atractivos que los usuarios pueden manipular (arrastrar, girar y acercar o alejar)
directamente en el explorador.
Lee datos y actualiza la pantalla, pero no interrumpe al usuario al actualizar la pgina completa.
La aplicacin se puede ejecutar en el explorador web o se puede configurar de modo que los
usuarios puedan ejecutarla en su equipo (ejecucin fuera del explorador).
Aplicacin de Silverlight con grficos enriquecidos e interaccin con el usuario
Los desarrolladores web y diseadores de grficos pueden crear aplicaciones de Silverlight de diversas
maneras. Se puede utilizar el marcado de Silverlight para crear elementos multimedia y grficos y
manipularlos con lenguajes dinmicos y cdigo administrado. Silverlight tambin permite utilizar
herramientas de calidad profesional, como Visual Studio para la codificacin y Microsoft Expression Blend
para la esquematizacin y el diseo grfico.
Controles
Control RichTextBox
El control RichTextBox permite mostrar, escribir y modificar texto enriquecido. Es posible aplicar formato de
caracteres o de prrafos al texto, mostrar hipervnculos y agregar imgenes incorporadas.
Control Viewbox
El control Viewbox es un decorador de contenido que toma un elemento secundario y lo ajusta o lo escala
de acuerdo con el tamao de Viewbox.
Control WebBrowser
El control WebBrowser proporciona una superficie para mostrar contenido HTML cuando la aplicacin se
ejecuta fuera del explorador.
Control WebBrowserBrush
El control WebBrowserBrush se puede usar para mostrar el contenido HTML de un control WebBrowser. Por
ejemplo, se puede utilizar un control WebBrowserBrush para dibujar el relleno (Fill) de una forma, como
Rectangle, o el contenido de la geometra de una forma Path.
Multimedia
Cmara web y micrfono
Ahora, es posible capturar la entrada de origen del dispositivo de audio o de vdeo del usuario. El mtodo
CaptureImageAsync habilita un escenario de captura de pantalla simple y el mtodo VideoBrush.SetSource
habilita un escenario de reproduccin de vdeo simple. En escenarios ms avanzados, se puede obtener
acceso a los datos de audio o vdeo sin formato para procesarlos en formatos de archivo. Para las capturas
de cmara web y de micrfono, se usa una metfora de receptor para establecer una clase de agente de
escucha y, para obtener una captura, se requiere el permiso del usuario del cliente para obtener acceso al
dispositivo de captura.
DRM para escenarios sin conexin
Hay varias caractersticas nuevas integradas en la administracin de derechos digitales (DRM) de Silverlight
que se pueden utilizar para implementar escenarios sin conexin, como compras, descargas, alquileres y
suscripciones.
Varias transformaciones
Ahora, se puede utilizar la clase CompositeTransform para aplicar varias transformaciones al mismo objeto,
como sesgos y giros. Esta clase aplica varias transformaciones en un orden de preferencia y, en general, se
presta mejor para la aplicacin de varias transformaciones a un objeto que la clase TransformGroup.
Redes
Multidifusin
El espacio de nombres System.Net.Sockets ha agregado compatibilidad con los clientes de multidifusin
UDP. De este modo, los clientes de red podrn aprovechar las aplicaciones de multidifusin que usen ms
eficazmente los recursos de la red.
Recuperar la directiva de seguridad de sockets a travs de HTTP
En el caso de una solicitud de conexin mediante System.Net.Sockets, una aplicacin puede optar por
recuperar el archivo de directivas de los sockets a travs del protocolo HTTP en el puerto TCP 80 en lugar
del protocolo TCP personalizado en el puerto 943. Esto permite a los servidores HTTP que ya ejecutan
servicios HTTP autorizar las conexiones mediante sockets de las aplicaciones de Silverlight sin tener que
implementar un nuevo servicio TCP en el servidor ni abrir un puerto a travs de un firewall para el puerto
943. El archivo de directivas de los sockets se recupera a travs de HTTP usando como host la direccin IP
resuelta que es el destino de la conexin de socket. Esto da lugar a una directiva autoritativa en el nivel de
equipo para el destino que es necesaria para los recursos del equipo, como los sockets. En cambio, el
archivo de directivas que usan las clases HTTP y WebClient en el espacio de nombres System.Net se
recupera del dominio de host que es el destino de la solicitud HTTP. El protocolo HTTP permite aislar los
recursos segn el dominio a travs del encabezado Host.
Directiva de seguridad flexible para aplicaciones de confianza
El espacio de nombres System.Net.Sockets incluye compatibilidad con las restricciones de directivas de
seguridad flexibles que se aplican a las aplicaciones de confianza de ejecucin fuera del explorador que se
comunican mediante System.Net.Sockets.
Procesamiento de HTTP de cliente
Se han agregado varias caractersticas que se pueden usar cuando se opta por el procesamiento de HTTP de
cliente para las llamadas de conexin de red:
El encabezado Referer se enva con todas las solicitudes
Compatibilidad con la autenticacin bsica y NTLM
Compatibilidad con el almacenamiento en cach
Capacidad para habilitar o deshabilitar el almacenamiento en bfer de secuencias de las solicitudes
de lectura y escritura
El lmite de conexiones simultneas aumenta de 2 a 6
Impresin
Ahora, es posible imprimir la interfaz de usuario de una aplicacin de Silverlight mediante la clase
PrintDocument. PrintDocument permite mostrar al usuario un cuadro de dilogo de impresin e imprimir la
aplicacin o un elemento UIElement de la aplicacin.
Interfaz de usuario
Arrastrar y colocar
Silverlight 4 incluye varias API para admitir operaciones de arrastrar y colocar. Se puede seleccionar una lista
de archivos en aplicaciones fuera del rea de contenido de Silverlight, por ejemplo, Mis documentos en
Microsoft Windows. A continuacin, se puede arrastrar la lista de archivos seleccionada al rea de contenido
de Silverlight, controlar los eventos de colocacin en un elemento de destino concreto y, a continuacin,
procesar la lista de archivos mediante la informacin especificada por FileInfo, incluido el acceso al
contenido de los archivos a travs de secuencias. Para habilitarlo, hay que agregar el evento Drop as como
los eventos y propiedades relacionados a la clase UIElement base. Las clases de soporte, como
DragEventArgs, tambin van incluidas.
Acceso al Portapapeles
Silverlight 4 incluye varias API para admitir el acceso al objeto Clipboard. Se puede obtener o establecer la
informacin de texto Unicode en un objeto Clipboard compartido. Observe que ese acceso requiere el
permiso del usuario y se limita a los datos de texto Unicode. Hay restricciones adicionales, las cuales se
describen en el tema referente a Clipboard.
Eventos que se producen al hacer clic con el botn secundario del mouse
Silverlight 4 agrega los eventos MouseRightButtonDown y MouseRightButtonUp a la clase UIElement base.
Ahora, las aplicaciones pueden controlar los eventos que se producen al hacer clic con el botn secundario
del mouse y cambiar el comportamiento. De forma predeterminada, cuando el usuario hace clic con el
botn secundario en una aplicacin de Silverlight, se abre el cuadro de dilogo de configuracin de
Silverlight.
Comandos
En Silverlight 4, ButtonBase e Hyperlink admiten las propiedades Command y CommandParameter. La
propiedad Command puede hacer referencia a una implementacin de ICommand que procede del origen
de datos de un modelo de vista, a travs de {Binding}. El sistema de entrada de Silverlight interpretar el
comando en tiempo de ejecucin.
Estilos implcitos
Ahora, Style puede establecerse implcitamente. Los estilos implcitos permiten aplicar un estilo concreto a
todos los elementos de un tipo determinado.
Direccin de flujo de derecha a izquierda
Ahora, es posible establecer la direccin del contenido y del diseo de cada control de modo que fluya de
la derecha a la izquierda. Esto permite desarrollar aplicaciones de Silverlight en idiomas como el hebreo y el
rabe. La direccin de flujo se establece mediante la propiedad FlowDirection.
Compatibilidad con pantalla completa
Ahora, Silverlight permite a las aplicaciones permanecer en modo de pantalla completa cuando est activa
otra aplicacin.
Cambios en la API de elementos base
Adems de las caractersticas anteriores, los siguientes cambios realizados en DependencyObject, UIElement
y FrameworkElement pueden ser interesantes para los escenarios de la interfaz de usuario:
Ahora, la propiedad FrameworkElement.Cursor puede establecerse con las API del sistema de
propiedades.
FrameworkElement tiene un evento Unloaded.
Los eventos de texto para los editores de mtodos de entrada se admiten en el nivel de UIElement
de modo que se pueda aprovechar el enrutamiento.
Las llamadas al mtodo SetValue son ms coherentes con el comportamiento equivalente de WPF,
sobre todo en el caso de animaciones en ejecucin.
XAML
Silverlight 4 incluye un nuevo analizador de XAML como parte del runtime de Silverlight. El nuevo
analizador de XAML en Silverlight proporciona:
Mayor compatibilidad con el lenguaje XAML escrito originalmente para WPF.
Mayor compatibilidad con el lenguaje XAML definido en la especificacin [MS XAML].
Data
Enlace de datos
Ahora, el enlace de datos de Silverlight admite las siguientes caractersticas:
Enlace a instancias de DependencyObject.
Enlace a indizadores de String.
Capacidad para especificar las opciones de formato de String a travs de la propiedad
StringFormat.
Capacidad para especificar los valores de presentacin predeterminados a travs de las
propiedades TargetNullValue y FallbackValue.
Capacidad para agrupar los elementos de coleccin a travs de la propiedad GroupDescriptions de
la clase CollectionViewSource.
Compatibilidad con la interfaz ICollectionViewFactory, que permite a las colecciones de entidades
de datos proporcionar implementaciones personalizadas de ICollectionView a las clases DataGrid y
CollectionViewSource.
Compatibilidad con una validacin compleja de varias propiedades de objetos enlazados que
implementan la interfaz IDataErrorInfo o INotifyDataErrorInfo. Esto incluye compatibilidad con estas
interfaces por parte del motor de enlaces y los controles de la interfaz de usuario, como DataGrid.
Una nueva clase DataServiceCollection(Of T) proporciona enlaces simplificados para los datos devueltos por
Servicios de datos de WCF. Esta clase hereda de la clase ObservableCollection(Of T) para actualizar
automticamente los datos enlazados cuando se producen cambios en los datos de los controles enlazados.
Servicios de datos de WCF
Se ha agregado la siguiente funcionalidad al cliente de Servicios de datos de WCF en esta versin de
Silverlight:
Una nueva clase DataServiceCollection(Of T) proporciona enlaces simplificados de los datos de los
servicios de datos a los controles de Silverlight. Esta clase hereda de la clase
ObservableCollection(Of T) para actualizar automticamente los datos enlazados cuando se
producen cambios en los datos de los controles enlazados.
Ahora, el cliente de Servicios de datos de WCF en Silverlight admite la ejecucin fuera del
explorador y la ejecucin entre dominios.
El cliente de Servicios de datos de WCF admite la siguiente nueva funcionalidad de Open Data Protocol
(OData) en esta versin de Silverlight:
Un servicio OData puede devolver nicamente el nmero total de los recursos representados por
un URI o incluir esta informacin referente al recuento de filas junto con los datos de los recursos
en una sola respuesta. El cliente de Servicios de datos de WCF para Silverlight se ha actualizado de
modo que se pueda obtener acceso a esta informacin referente al recuento de filas que va
incluida en la respuesta a una consulta de la aplicacin.
Un servicio de datos se puede configurar de modo que los recursos solicitados se devuelvan como
un conjunto de respuestas paginadas. El cliente de Servicios de datos de WCF para Silverlight se ha
actualizado de modo que permita administrar esas respuestas paginadas.
Ahora, los resultados de consulta devueltos por un servicio OData pueden proyectarse en tipos
definidos arbitrariamente. El cliente de Servicios de datos de WCF para Silverlight se ha actualizado
de modo que se admita la proyeccin mediante la clusula select (Select en Visual Basic) en una
consulta LINQ.
El cliente de Servicios de datos de WCF para Silverlight se ha actualizado de modo que sea posible
obtener y establecer las propiedades binarias como una secuencia de un servicio OData compatible
con los recursos multimedia.
Modelo de aplicaciones
Servicios RIA de WCF
Los servicios RIA de WCF simplifican el desarrollo de soluciones de n niveles para aplicaciones de Internet
enriquecidas (RIA), como las aplicaciones de Silverlight. Uno de los problemas comunes al desarrollar
soluciones RIA de n niveles es la coordinacin de la lgica de aplicacin entre el nivel intermedio y el nivel
de presentacin. Los servicios RIA resuelven este problema ya que proporcionan componentes de marco de
trabajo, herramientas y servicios que hacen que la lgica de aplicacin en el servidor est disponible para el
cliente de RIA sin tener que duplicar manualmente esa lgica de programacin. Los servicios RIA funcionan
con Silverlight 4 pero estn disponibles como una instalacin independiente.
Extensibilidad de la navegacin
Es posible extender la navegacin de Silverlight para admitir la resolucin arbitraria de los identificadores
URI. Por ejemplo, se pueden implementar extensiones de navegacin para la redireccin de los
identificadores URI, la generacin de pginas dinmicas y la descarga a peticin de pginas del servidor.
Las clases NavigationService y Frame tambin proporcionan un mtodo Refresh. Este mtodo resulta til en
el caso de usar extensiones de navegacin que pueden proporcionar contenido diferente para el mismo
identificador URI segn las interacciones con el usuario en una pgina determinada. Por ejemplo, esto
habilita algunos escenarios de navegacin con pginas que requieren la autenticacin del usuario.
Dynamic Language Runtime
Dynamic Language Runtime (DLR) es un nuevo entorno en tiempo de ejecucin que agrega a CLR un
conjunto de servicios para lenguajes dinmicos. Para admitir DLR, se ha agregado el nuevo espacio de
nombres System.Dynamic a .NET Framework y se han extendido los rboles de expresin con nuevos tipos
que representan el flujo de control, como LoopExpression y TryExpression.
Principal
Clases de coleccin
La nueva interfaz ISet(Of T) permite la abstraccin de los conjuntos. Los conjuntos son colecciones que
tienen elementos nicos y operaciones especficas. La clase HashSet(Of T), que ahora est disponible para
las aplicaciones basadas en Silverlight, implementa la interfaz ISet(Of T).
Tuplas
Silverlight 4 proporciona la clase Tuple para crear objetos de tupla que contienen datos estructurados.
Tambin proporciona clases de tupla genricas que tienen de uno a siete parmetros de tipo para
representar singletons, pares, triples, cudruplos, etc. Para admitir objetos de tupla con nueve o ms
componentes, hay una clase de tupla genrica que tiene siete parmetros de tipo y un octavo parmetro de
cualquier tipo de tupla.
Analizar y dar formato a los intervalos de tiempo
Para admitir un formato que tiene en cuenta la referencia cultural, ahora la estructura TimeSpan implementa
la interfaz IFormattable e incluye nuevas sobrecargas de los mtodos ToString, Parse, TryParse, ParseExact y
TryParsExact. Sus mtodos de formato y de anlisis tambin admiten cadenas de formato estndar y
personalizado.
Otras caractersticas bsicas
En la lista siguiente, se describen las nuevas capacidades y mejoras que se han agregado a Silverlight.
Algunas de ellas estn basadas en sugerencias de los clientes.
El nuevo mtodo String.IsNullOrWhiteSpace indica si una cadena es nula, est vaca o consta solo
de caracteres de espacio en blanco. Se han agregado nuevas sobrecargas a los mtodos String.Join
y String.Concat, que concatenan los miembros de colecciones
System.Collections.Generic.IEnumerable(Of T).
El mtodo String.Concat permite concatenar todos los elementos de una coleccin enumerable sin
convertir primero los elementos en cadenas.
El mtodo StringBuilder.Clear permite borrar con mayor facilidad una instancia de StringBuilder.
El nuevo mtodo Enum.HasFlag determina si uno o ms campos o marcas de bits estn
establecidos en un valor de enumeracin. El mtodo Enum.TryParse devuelve un valor booleano
que indica si una cadena o un valor entero se pudo analizar correctamente.
Las aplicaciones de confianza pueden utilizar las nuevas sobrecargas del mtodo Path.Combine que
permiten combinar rutas de acceso a archivos.
Los nuevos mtodos de enumeracin de archivos pueden mejorar el rendimiento de las
aplicaciones de confianza que obtienen acceso a directorios o que iteran por las lneas de archivos
de gran tamao. Solo se puede obtener acceso a los directorios y archivos ubicados en Mis
documentos.
Ahora puede habilitar la inicializacin diferida para cualquier tipo personalizado ajustando el tipo
dentro de una clase System.Lazy(Of T).
La nueva sobrecarga del mtodo Monitor.Enter(Object, Boolean) toma una referencia booleana y la
establece de forma atmica en true solo si se entra correctamente en el monitor.
Ahora, la estructura System.Guid contiene los mtodos TryParse y TryParseExact.
Silverlight Designer
En Visual Studio 2010, se han realizado varias mejoras del diseador para ayudar a crear aplicaciones de
Silverlight. En Visual Studio 2008, la compatibilidad del diseador con los proyectos de Silverlight era
limitada. Ahora, en Visual Studio 2010, se pueden realizar tareas, como seleccionar y colocar elementos con
el mouse en la superficie de diseo as como establecer propiedades en la ventana Propiedades.
Requisitos previos
Puede ejecutar todos los ejemplos de este tema sin necesidad de instalar nada, salvo el motor en tiempo de
ejecucin de Silverlight 4. Sin embargo, si desea compilar o modificar los ejemplos, necesitar Silverlight
Tools y un proyecto de trabajo de Silverlight.
En este tema se usa la API administrada para Silverlight. Tambin puede desarrollar aplicaciones basadas en
Silverlight utilizando la API de JavaScript para Silverlight.
XAML
XAML es un lenguaje de marcado declarativo que puede usar para definir los elementos de la interfaz de
usuario de la aplicacin basada en Silverlight. Al crear un nuevo proyecto de Visual Studio, se crea
automticamente un archivo Page.xaml. En el archivo de XAML, puede crear objetos y definir sus
propiedades mediante etiquetas y atributos XML.
A continuacin se muestra una instruccin XAML simple que crea un rectngulo rojo.
Puede crear todas las interfaces de usuario en XAML, usar la superficie de diseo de Visual Studio o puede
usar Microsoft Expression Blend para disear la aplicacin. Expression Blend es una herramienta de
diseador con una superficie de diseo WYSIWYG que sirve para crear aplicaciones basadas en Silverlight.
Expression Blend genera un archivo de XAML que es posible modificar directamente. Tambin es posible
enlazar eventos y escribir cdigo subyacente con Expression Blend.
Diseo
Al crear una aplicacin basada en Silverlight, una de las primeras decisiones que tendr que tomar ser
cmo organizar la interfaz de usuario. Silverlight proporciona 3 paneles de diseo al usuario. El panel
predeterminado es Grid, que es el panel de diseo ms flexible y eficaz.
Contenedor Descripcin
Canvas Coloque los elementos secundarios en posiciones absolutas en el espacio x,y.
Coloque los elementos secundarios en posiciones relativas entre s en pilas horizontales o
StackPanel
verticales.
Grid Coloque los elementos secundarios en filas y columnas.
En el ejemplo siguiente, se coloca un elemento Rectangle en la celda 1,1 de una cuadrcula. La cuadrcula
usa un ndice de base cero, de modo que el rectngulo se muestra en la celda inferior derecha.
<Grid ShowGridLines="True">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Rectangle Fill="Red" Width="150" Height="100" Grid.Column="1" Grid.Row="1"/>
</Grid>
Controles
Los controles de Silverlight permiten hospedar contenido u otros controles y pueden disearse de modo
que muestren los cambios de estado del usuario. Los controles varan en funcionalidad de elementos que
permiten la interaccin del usuario, como Button o TextBox, a elementos que admiten un diseo complejo
de la informacin, como DataGrid.
Silverlight incluye plantillas predeterminadas para cada control que afectan al aspecto del control. No
obstante, es posible crear plantillas personalizadas para cambiar el aspecto y el comportamiento visual de
todos los controles.
En el ejemplo siguiente se toma el ejemplo anterior y se agrega un botn a la celda 0,0 de la cuadrcula.
<Grid ShowGridLines="True">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Button Height="25" Width="100" Grid.Column="0" Grid.Row="0"/>
<Rectangle Fill="Red" Width="150" Height="100" Grid.Column="1" Grid.Row="1"/>
</Grid>
Lenguajes dinmicos
Silverlight Tools para Visual Studio incluye Dynamic Language Runtime (DLR), que permite a los usuarios de
lenguajes dinmicos, como Python y Ruby, escribir aplicaciones basadas en Silverlight. Los lenguajes
dinmicos se empaquetan como cdigo fuente, no se compilan en ensamblados, y el cdigo puede
generarse y compilarse en tiempo de ejecucin. Resultan apropiados para un estilo de desarrollo flexible e
interactivo. Silverlight incluye tres lenguajes dinmicos: IronPython, IronRuby y JScript administrado.
Grficos
Silverlight proporciona muchas opciones para agregar caractersticas visuales interesantes a la aplicacin.
Puede usar dibujos, formas, rutas y geometras complejas. Las reas definidas por geometras pueden
rellenarse con efectos, como imgenes, degradados de color o clips de vdeo, mediante el uso de pinceles.
Puede transformar grficos y otros objetos en la pantalla (por ejemplo, girarlos o inclinarlos). Incluso puede
aplicar efectos 3D.
Puede agregar imgenes y efectos de imagen a la aplicacin. Silverlight tambin incluye Deep Zoom, que
permite hacer zoom y panormicas con facilidad de imgenes de gran detalle.
En el ejemplo siguiente el rectngulo se rellena con un pincel de degradado lineal.
<Rectangle x:Name="rect1" Width="150" Height="100" Grid.Column="1" Grid.Row="1">
<Rectangle.Fill>
<LinearGradientBrush>
<GradientStop Offset="0" Color="LightBlue"/>
<GradientStop Offset="0.4" Color="Blue"/>
<GradientStop Offset="0.8" Color="Purple"/>
<GradientStop Offset="1.0" Color="Lavender"/>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
Multimedia y animacin
Adems de grficos estticos, puede agregar animaciones, audio y vdeo a la aplicacin para hacerla ms
dinmica e interactiva.
En el ejemplo siguiente se aumenta y se reduce el tamao del rectngulo del ejemplo anterior hasta que se
hace clic en el botn Detener.
<Grid ShowGridLines="True">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.Resources>
<Storyboard x:Name="AnimateRectangle">
<DoubleAnimation Storyboard.TargetName="rect1"
Storyboard.TargetProperty="Height"
From="0" To="100" AutoReverse="True" Duration="0:0:02"
RepeatBehavior="Forever"/>
<DoubleAnimation Storyboard.TargetName="rect1"
Storyboard.TargetProperty="Width"
From="0" To="100" AutoReverse="True" Duration="0:0:04"
RepeatBehavior="Forever"/>
</Storyboard>
</Grid.Resources>
<Button Height="25" Width="100"
Grid.Column="0" Grid.Row="0"
Content="Stop"
Click="Button_Click"/>
<Rectangle x:Name="rect1" Width="150" Height="100" Grid.Column="1" Grid.Row="1" Loaded="OnLoaded">
<Rectangle.Fill>
<LinearGradientBrush>
<GradientStop Offset="0" Color="LightBlue"/>
<GradientStop Offset="0.4" Color="Blue"/>
<GradientStop Offset="0.8" Color="Purple"/>
<GradientStop Offset="1.0" Color="Lavender"/>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
<Button Height="25" Width="100"
Grid.Column="0" Grid.Row="1"
Content="Start"
Click="Button_Click_1"/>
</Grid>
Data
Muchas aplicaciones basadas en Silverlight trabajan con datos. Puede mostrar conjuntos de datos utilizando
controles como DataGrid y ListBox. Para rellenar la interfaz de usuario, puede usar Enlace de datos. Si enlaza
la interfaz de usuario al objeto de datos, las actualizaciones del objeto se propagarn automticamente a la
interfaz de usuario.
Los datos incluidos en la aplicacin pueden proceder de varios orgenes, como una fuente RSS, pero suelen
estar en formato XML. Silverlight incluye XmlReader y LINQ para analizar los datos XML. LINQ resulta ms
adecuado cuando se analizan fragmentos de datos ms pequeos.
Redes
Silverlight proporciona varias caractersticas para comunicarse en la nube. La clase WebClient controla la
descarga de contenido en el cliente. Tambin puede usar WebClient para enviar y recibir mensajes XML sin
formato. Las aplicaciones basadas en Silverlight tambin pueden obtener acceso a servicios Web, como
Windows Communication Foundation (WCF), SOAP y ASP.NET AJAX.
Nota:
Silverlight admite dos modelos de programacin: la API de JavaScript para Silverlight y la API administrada
para Silverlight. La API administrada se basa en un subconjunto de .NET Framework. Muchas de las
caractersticas que se mencionan en este artculo son nicamente compatibles con la API administrada.
Plataforma de Silverlight
La plataforma de Silverlight en su conjunto se compone de dos partes principales, adems de un
componente de instalador y actualizacin, tal y como se describe en la siguiente tabla.
Componente Descripcin
Componentes y servicios orientados a la interfaz de usuario y la interaccin con el
usuario, incluidos los datos proporcionados por el usuario, controles de interfaz de
Marco de trabajo
usuario ligeros para su uso en las aplicaciones web, reproduccin de elementos
de presentacin
multimedia, administracin de derechos digitales, enlaces de datos; y caractersticas de
bsico
presentacin, incluidos grficos vectoriales, texto, animaciones e imgenes. Tambin
incluye el lenguaje XAML para especificar el diseo.
Subconjunto de .NET Framework que contiene componentes y bibliotecas, que incluyen
integracin de datos, controles de Windows extensibles, funciones de red, bibliotecas de
clases base, recoleccin de elementos no utilizados y CLR (Common Language Runtime).
En la ilustracin siguiente se muestran estos componentes de la arquitectura de Silverlight, junto con los
componentes y servicios relacionados.
Arquitectura de Silverlight
Caracterstica Descripcin
Administra datos de entrada procedentes de distintos dispositivos de
Entrada
hardware, como los de dibujo, el teclado y el mouse, y otros.
Representacin de la interfaz
Representa grficos vectoriales y de mapa de bits, animaciones y texto.
de usuario
Los programadores pueden interactuar con este marco de trabajo de presentacin utilizando XAML para
especificar los detalles de presentacin. XAML constituye el punto primario de interaccin entre .NET
Framework y la capa de la presentacin. Los programadores pueden manipular la capa de presentacin
mediante programacin con cdigo administrado.
Caracterstica Descripcin
Admite las caractersticas de LINQ (Language-Integrated Query) y de LINQ to XML,
que facilitan el proceso de integrar datos procedentes de orgenes dispares y
Data
trabajar con ellos. Tambin admite el uso de las clases de serializacin y XML para
administrar los datos.
Un conjunto de bibliotecas de .NET Framework que proporcionan las funciones de
Biblioteca de clases
programacin esenciales, como la administracin de cadenas, expresiones
base
regulares, entrada y salida, reflexin, colecciones y globalizacin.
Proporciona caractersticas para simplificar el acceso a los servicios y datos
Windows remotos. Esto incluye un objeto de explorador, un objeto de solicitud y respuesta
Communication HTTP, compatibilidad con solicitudes HTTP entre dominios, compatibilidad con
Foundation (WCF) fuentes de distribucin RSS/Atom as como compatibilidad con los servicios JSON,
POX y SOAP.
CLR (Common Proporciona administracin de memoria, recoleccin de elementos no utilizados,
Language Runtime) comprobacin de seguridad de tipos y control de excepciones.
Controles de WPF Proporciona un conjunto enriquecido de controles, como son Button, Calendar,
(Windows Presentation CheckBox, DataGrid, DatePicker, HyperlinkButton, ListBox, RadioButton y
Foundation) ScrollViewer.
Admite la compilacin y ejecucin dinmicas de lenguajes de scripting como
DLR (Dynamic JavaScript y IronPython para programar aplicaciones basadas en Silverlight. Incluye
Language Runtime) un modelo conectable que aporta compatibilidad con otros lenguajes para su uso
con Silverlight.
.NET Framework para Silverlight es un subconjunto de la plataforma .NET Framework completa. Proporciona
los fundamentos del desarrollo robusto y orientado a objetos para tipos de aplicaciones (como las de
Internet) que tradicionalmente no contaban con este tipo de recursos.
Los desarrolladores pueden interactuar con la capa de .NET Framework para Silverlight escribiendo cdigo
administrado en C# y Visual Basic. Los desarrolladores de .NET Framework tambin pueden tener acceso a
la capa de presentacin creando sus aplicaciones en Visual Studio o Microsoft Expression Blend.
Caracterstica Descripcin
La mayora de las aplicaciones de Silverlight 3 funcionarn con Silverlight 4 sin ningn cambio.
Cuando se requieren cambios importantes, Silverlight intentar mantener la compatibilidad con el
comportamiento anterior y con el comportamiento nuevo mediante un modo quirks.
No obstante, es posible que algunos cambios realizados en los componentes de Silverlight generen un error
en las aplicaciones basadas en Silverlight anteriores (tiempo de compilacin, tiempo de carga de XAML o
posiblemente tiempo de diseo) o hagan que dichas aplicaciones tengan un comportamiento distinto.
En este tema, se describen los cambios realizados en Silverlight 4 con respecto a Silverlight 3. No se
describen las nuevas caractersticas ni mejoras de Silverlight 4
Este tema contiene las siguientes secciones:
Cambios en el analizador de XAML En esta seccin, se describen los cambios realizados en el
analizador de XAML de Silverlight 4.
Cambios importantes desde Silverlight 3 En esta seccin, se describen los cambios que podran
interrumpir las aplicaciones escritas para Silverlight 3 que los usuarios ejecutan en el runtime de
Silverlight 4, incluso cuando el manifiesto de aplicacin tiene como destino Silverlight 3.
Comportamiento en modo quirks En esta seccin, se describen las diferencias de
comportamiento del runtime o de su API que son especficas de la versin. Estas diferencias de
comportamiento se basan en la versin del runtime que la aplicacin tiene como destino. En
muchas ocasiones, los cambios representan correcciones de errores que se han introducido en
Silverlight 4, pero el comportamiento de Silverlight 3 sigue siendo accesible como un modo quirks
especfico, que se utiliza nicamente cuando la aplicacin tiene como destino un runtime de
Silverlight 3. Esto es as por si la lgica de la aplicacin se basa en el comportamiento de
Silverlight 3.
Cambios importantes en la actualizacin En esta seccin, se describen los cambios que se aplican
cuando se recompila una aplicacin de Silverlight 3 y el destino previsto es Silverlight 4.
Cambios importantes desde la versin Beta de Silverlight 4 En esta seccin, se describen los
cambios que se aplican nicamente a las aplicaciones compiladas especficamente para la versin
Beta de Silverlight 4, que es la ltima versin pblica del runtime de Silverlight. No hay modo
quirks para el comportamiento de la versin Beta de Silverlight 4.
del mouse para que se vuelva a ejecutar la prueba de posicionamiento y para que los controles puedan
cambiar su estado si es necesario.
Ahora, al cambiar las propiedades DisplayMemberPath e ItemTemplate de
ItemControl, se vuelven a crear todos los contenedores
En Silverlight 3, establecer las propiedades DisplayMemberPath e ItemTemplate de una plantilla de
elementos, como en el siguiente cdigo, no tena ningn efecto una vez finalizada la medicin de ListBox.
<ListBox x:Name="lb" ItemTemplate="{StaticResource lbItem}">
lb.ItemTemplate = lbItemTemplate;
lb.DisplayMemberPath = itemDisplayPath;
En Silverlight 4, este cdigo invalidar todos los contenedores realizados y los volver a crear incluso
despus de su medicin.
Orgenes de BitmapImage compartidos
Cuando dos controles BitmapImage comparten el mismo origen de BitmapImage y no tienen establecido un
valor explcito de Width/Height (es decir, usan un tamao natural), el segundo control Image no representa
su BitmapImage en Silverlight 3. Este comportamiento se ha corregido en Silverlight 4 y, ahora, ambos
controles Image debern representar correctamente su contenido.
IronPython 2.0.2 y versiones anteriores
Silverlight 4 no funciona con versiones anteriores de IronPython; es necesario actualizar a la versin
IronPython 2.0.3 o posterior, que se puede descargar desde http://ironpython.codeplex.com/.
Microsoft.Jscript.Compiler.dll / Microsoft.Jscript.Runtime.dll
Silverlight 4 no funciona con Microsoft.Jscript.Compiler.dll / Microsoft.Jscript.Runtime.dll, que tambin se
conocen como "DLR Jscript" y a veces como "Jscript administrado". La ltima versin experimental de DLR
Jscript se public como parte de la versin Alfa de Dynamic Languages SDK 0.4.0. Esta caracterstica se ha
eliminado porque no era totalmente funcional. Vea http://dlr.codeplex.com/Thread/View.aspx?
ThreadId=58121 para obtener informacin detallada. (DLR JScript no debe confundirse con la API de
JavaScript basada en explorador para Silverlight que es ms comn y sigue funcionando.)
DRM y clientes con SO en particiones FAT32
En Silverlight 3, DRM funciona correctamente en los sistemas de cliente donde el sistema operativo est
instalado en una unidad o particin FAT32. (Esta situacin se da para un nmero reducido de sistemas
operativos Windows XP que no usan deliberadamente los valores predeterminados de la instalacin o
conversin del SO.)
En Silverlight 4, las caractersticas de DRM ya no funcionan en los sistemas de cliente donde el sistema
operativo est instalado en una unidad o particin FAT32.
Para solucionarlo, se recomienda realizar una conversin a NTFS.
RuntimeVersion refleja la versin de compilacin de Silverlight que haba en el equipo del desarrollador
cuando se compil la aplicacin.
Si se compila la aplicacin con las herramientas de Silverlight 4 y se elige especficamente Silverlight 3 como
destino, se podr invocar el modo quirks como si se hubiera compilado la aplicacin con las herramientas
de Silverlight 3.
Control correcto de los espacios en blanco con etiquetas Span y contenedores
El objeto TextBlock en Silverlight 3 (y RichTextArea en la versin Beta de Silverlight 4) tena un error en la
composicin de <Span> o <Run> porque el espacio en blanco en el XAML (normalmente para dar formato)
se utilizaba en realidad como contenido. A veces, esto requera limitar las lneas nuevas en el origen de
XAML y daba lugar a un XAML poco legible para el usuario. Este comportamiento est en modo quirks para
Silverlight 3, como parte del comportamiento ms exhaustivo del analizador de XAML que se describe en
Diferencias en el procesamiento de XAML entre Silverlight 3 y Silverlight 4.
Los contenedores de texto en Silverlight 4 aceptan contenido de texto y crean ejecuciones implcitas en el
modelo de objetos para cualquier contenido de texto de "innertext". Esto es necesario para generar un
espacio en blanco entre los elementos de texto separados por CRLF. Por ejemplo:
<Run>Some</Run>
<Run>Text</Run>
Se transforma en:
<Run>Some</Run><Run> </Run><Run>Text</Run>
Las condiciones para recortar los espacios en blanco iniciales y finales se han ampliado en Silverlight 4.
Anteriormente, se recortaban los espacios en blanco iniciales para los elementos Run implcitos, a menos
que el elemento Run fuese precedido por un elemento Run explcito. En Silverlight 4, se recortan los
espacios en blanco iniciales a menos que el elemento Run implcito vaya precedido por un elemento de
texto explcito que NO sea un elemento Run (por ejemplo, Span, InlineUIContainer, Hyperlink) o un
elemento Run explcito.
Ahora, el mtodo Clear del control Panel llama a InvalidateMeasure
En Silverlight 4, cuando se invoca el mtodo Clear de una coleccin de elementos Panel, se llama al mtodo
InvalidateMeasure. De este modo, se activar un efecto sobre el diseo en el paso siguiente. En Silverlight 3,
una llamada a Clear seguir sin tener ningn efecto sobre el diseo de Panel.
Ahora, VirtualizingStackPanel.MouseWheelUp y VirtualizingStackPanel.Morse
WheelDown producen un desplazamiento de tres lneas
En las aplicaciones compiladas de Silverlight 3, los mtodos MouseWheelDown y MouseWheelUp seguirn
produciendo un desplazamiento de una lnea. Sin embargo, en las aplicaciones de Silverlight 4, estos
mtodos producen un desplazamiento de tres lneas.
Ahora, ImageBrush.ImageSource devuelve el objeto ImageSource en lugar de
UriSource
En las aplicaciones de Silverlight 3, ImageBrush.ImageSource devuelve el valor de UriSource de su
ImageSource (una cadena). Esto coincide con el comportamiento original de JavaScript en Silverlight 1.0.
En Silverlight 4, se devuelve el objeto ImageSource real, que puede ser un objeto WriteableBitmap o
BitmapImage.
Ahora, cambiar el valor base durante una animacin funciona segn lo previsto
En Silverlight 3, si se llamaba al mtodo SetValue en una propiedad durante una animacin activa, el
resultado se aplicaba solamente a ese paso. El mtodo SetValue cambiaba correctamente ese valor pero, en
el siguiente paso de la animacin activa, la animacin sobrescriba el valor establecido. En muchas
ocasiones, pareca que no haba cambiado nada visualmente (el cambio al nuevo valor se realizaba tan
rpidamente que el usuario no lo perciba). La llamada al mtodo SetValue no cambiaba el valor base de la
animacin (resultado de GetAnimationBaseValue). Cuando se detena la animacin, el valor base se
restableca en el valor que la propiedad tena antes del inicio de la animacin y omita el mtodo SetValue.
En Silverlight 4, si el valor de una propiedad cambia durante una animacin activa, la llamada al mtodo
SetValue modificar el valor base de la animacin. Cuando se detiene la animacin, esta utilizar el nuevo
valor base. Esto se corresponde con el comportamiento en WPF. (Observe que las animaciones HoldEnd no
se ven necesariamente afectadas por este cambio.)
ReadLocalValue devuelve el valor local durante una animacin
En Silverlight 3, cuando se anima una propiedad y la animacin se est ejecutando, una llamada al mtodo
ReadLocalValue devuelve el valor animado.
En Silverlight 4, una llamada al mtodo ReadLocalValue devolver el valor local. Esto se corresponde con el
comportamiento en WPF. Si desea obtener el valor animado, llame al mtodo GetValue.
No se invocan los establecedores duplicados en un estilo cuando todos hacen
referencia a la misma propiedad adjunta
En Silverlight 3, era posible utilizar varios objetos StyleSetter para establecer dos veces la misma propiedad
adjunta. En algunos escenarios se utilizaba esta caracterstica.
En Silverlight 4, este comportamiento ya no est habilitado. No es un error de sintaxis establecer dos veces
la misma propiedad adjunta en Setters. Sin embargo, el subsistema de estilos de Silverlight invocar
solamente el LTIMO objeto Setter que haga referencia a la propiedad adjunta; los dems establecedores
no sern operativos. Esto se corresponde con el comportamiento en WPF.
Zoom del explorador y Content.Resized
En Silverlight 4, si una aplicacin enlaza el evento Resized, se aplicar automticamente un zoom a la vista
del rea de contenido de Silverlight cuando cambie el nivel de zoom del explorador. Si una aplicacin de
Silverlight 4 desea deshabilitar el zoom automtico del explorador, deber establecer explcitamente el valor
de la propiedad EnableAutoZoom en false.
En Silverlight 3, se supona que las aplicaciones que realizaban escuchas de Resized se encargaban ellas
mismas del zoom del explorador y deshabilitaban el zoom automtico del explorador. Por consiguiente, en
modo quirks, no hay ningn comportamiento de zoom asociado al evento Resized cuando la aplicacin
tiene Silverlight 3 como destino.
Cambios en la API de MEF
A continuacin, se describen los cambios especficos que se han realizado en la API de Managed Extension
Framework (MEF) y que estn presentes en los componentes de MEF de Silverlight (ensamblado
System.ComponentModel.Composition y ensamblados relacionados).
PartCreator<T> pasa a denominarse ExportFactory<T> y se ha movido a System.
ComponentModel.Composition.Initialization.dll
PartInitializer pasa a denominarse CompositionInitializer
CompositionHost.InitializeContainer pasa a denominarse CompositionHost.Initialize
PackageCatalog se ha reemplazado por DeploymentCatalog
Comparaciones de cadenas y CultureInfo
Algunas API de comparacin de cadenas de las clases String y Char usan una lgica diferente para el modo
en que obtienen el objeto CultureInfo en vigor, segn si la aplicacin se ejecuta en Silverlight 3 o en
Silverlight 4. Esto se aplica nicamente a los casos en los que una sobrecarga no pasa ningn objeto
CultureInfo concreto. El comportamiento est en modo quirks, por lo que las aplicaciones de Silverlight 3 no
tienen que corregirlo. En la tabla siguiente se indican las diferencias entre las API.
Silverlight 4
Al presionar la tecla FLECHA ARRIBA en Silverlight 4, se activa el control TabItem anterior (es decir, el
situado encima del control TabItem activo en modo de diseo vertical cuando el valor de TabStripPlacement
es Left o Right). Al presionar la tecla FLECHA ABAJO, se activa el control TabItem siguiente (es decir, el
situado debajo del control TabItem activo en modo de diseo vertical). Este es el comportamiento
actualizado si se hace referencia o se distribuye el ensamblado System.Windows.Controls.dll de Silverlight 4.
Ahora, los controles tienen compatibilidad integrada con MouseWheel
En Silverlight 4, los siguientes controles tienen compatibilidad integrada con los eventos MouseWheel:
ListBox
TextBox
ComboBox
ScrollViewer
Calendar
DatePicker
DataGrid
En Silverlight 3, no hay compatibilidad integrada con MouseWheel.
Si se actualizan aplicaciones de Silverlight 3 a Silverlight 4, es posible quitar cualquier control especfico
anterior de los eventos de la rueda del mouse en el nivel de la aplicacin o quizs en el DOM HTML. Esto
podra aplicarse a cualquiera de los siguientes controles: ListBox, TextBox, ComboBox y ScrollViewer.
Nota:
Hay tambin controles compatibles con MouseWheel que no figuran aqu porque no existan en
Silverlight 3. Un ejemplo de ello es RichTextBox. Compruebe en las pginas de referencia de cada control si
hay reemplazos de OnMouseWheel u otras observaciones referentes al control del evento MouseWheel.
DESPUS
public class DomainAcquirer
{
public void CancelAsync();
public event EventHandler<DomainJoinCompletedEventArgs> DomainJoinCompleted;
public event EventHandler<DomainLeaveCompletedEventArgs> DomainLeaveCompleted;
}
public class LicenseAcquirer
{
public void CancelAsync();
public string ChallengeCustomData;
}
public class MediaLicense
{
public Nullable<DateTimeOffset> ExpirationDate;
}
public enum ContentKeyType
{
Aes128Bit,
Cocktail
}
ha cambiado a:
public event EventHandler<NotifyEventArgs> ScriptNotify;
ha cambiado a:
public Visibility Visibility { get; }
public event EventHandler Closed;
Ha cambiado a:
namespace System.Runtime.InteropServices.Automation
{
public sealed class AutomationEvent
public sealed class AutomationEventArgs : EventArgs
De este modo, se establece MyProperty en un objeto Binding con la ruta de acceso MyItem.
Despus del cambio:
<local:MyDependencyObject MyProperty="{Binding MyItem}" />
De este modo, se adjunta un objeto BindingExpression a la propiedad MyProperty que escucha la ruta de
acceso MyItem (es similar a una llamada al mtodo SetBinding). Las aplicaciones de Silverlight 4 que deseen
establecer el comportamiento de un objeto Binding debern convertir la propiedad de destino en una
propiedad de CLR en lugar de una DependencyProperty. Esto es coherente con el comportamiento de
FrameworkElement.
Ahora, HtmlBrush se denomina WebBrowserBrush
Es necesario cambiar a WebBrowserBrush todas las referencias a HtmlBrush. El espacio de nombres de CLR y
la ubicacin del ensamblado siguen siendo los mismos.
Se ha cambiado el nombre de los estados visuales de ListBoxItem
Se ha cambiado el nombre de dos de los estados visuales de ListBoxItem.
El estado visual Loaded en la versin Beta de Silverlight 4 se denomina ahora AfterLoaded.
El estado visual Unloaded en la versin Beta de Silverlight 4 se denomina ahora BeforeUnloaded.
Este cambio afectar al usuario si ha escrito plantillas para los controles de elementos que incluyan estos
estados visuales. Es necesario cambiar las plantillas de modo que incluyan los nuevos nombres de estado. Es
posible que este cambio tambin afecte al usuario si ha escrito lgica de VisualStateManager que utilice los
nombres de estado definidos por ItemsControl.
Los nuevos nombres de estado se reflejan en los atributos de CLR del tipo ListBoxItem. Estos estados no
existan en el control ListBoxItem de Silverlight 3.
No se admiten enlaces en un establecedor de estilo
En la versin Beta de Silverlight 4, se permitan sintcticamente los enlaces en un establecedor de estilo
(valor de Setter.Property) (aunque no funcionaban segn lo esperado en comparacin con usos
equivalentes en WPF).
En Silverlight 4, se han bloqueado sintcticamente los enlaces en un establecedor de estilo. Este fue tambin
el caso en Silverlight 3.
Administracin de la memoria
El recolector de elementos no utilizados de Common Language Runtime administra la asignacin y
liberacin de la memoria de una aplicacin. Esto significa que los programadores no tienen que escribir
cdigo para realizar tareas de administracin de memoria al programar aplicaciones administradas. La
administracin automtica de la memoria puede eliminar problemas frecuentes, como olvidar liberar un
objeto y causar una prdida de memoria, o intentar tener acceso a la memoria de un objeto que ya se ha
liberado.
Cuando se inicializa un nuevo proceso, el motor en tiempo de ejecucin reserva una regin contigua de
espacio de direcciones para el proceso. Este espacio de direcciones reservado se denomina montn
administrado. El montn administrado mantiene un puntero a la direccin a la que se asignar el siguiente
objeto del montn. Inicialmente, este puntero se establece en la direccin base del montn administrado.
Todos los tipos de referencia se asignan en el montn administrado. Cuando una aplicacin crea el primer
tipo de referencia, se le asigna memoria en la direccin base del montn administrado. Cuando la aplicacin
crea el siguiente objeto, el recolector de elementos no utilizados le asigna memoria en el espacio de
direcciones que sigue inmediatamente al primer objeto. Siempre que haya espacio de direcciones
disponible, el recolector de elementos no utilizados contina asignando espacio a los objetos nuevos de
este modo.
La asignacin de memoria desde el montn administrado es ms rpida que la asignacin de memoria no
administrada. Como el tiempo de ejecucin asigna memoria a los objetos agregando un valor a un puntero,
este mtodo es casi tan rpido como la asignacin de memoria desde la pila. Adems, puesto que los
nuevos objetos que se asignan consecutivamente se almacenan uno junto a otro en el montn
administrado, la aplicacin puede tener un acceso muy rpido a los objetos.
Adems de asignar memoria, el motor de optimizacin del recolector de elementos no utilizados determina
cul es el mejor momento para realizar una recoleccin, segn las asignaciones que se estn realizando.
Cuando el recolector de elementos no utilizados lleva a cabo una recoleccin, libera la memoria de los
objetos que ya no usa la aplicacin.
En Silverlight se presenta la caracterstica Deep Zoom, que permite ampliar y reducir imgenes o
colecciones de imgenes de alta-resolucin.
Nota:
Los controles del Kit de herramientas de Silverlight se actualizan peridicamente.
Control Silverlight o WPF Disponible para Silverlight
AccessText WPF No est disponible
AdornedElementPlaceholder WPF No est disponible
AdornerDecorator WPF No est disponible
AutoCompleteBox Silverlight SDK de Silverlight
Border Ambos Motor en tiempo de ejecucin
BulletChrome WPF No est disponible
BulletDecorator WPF No est disponible
Button Ambos Motor en tiempo de ejecucin
ButtonChrome WPF No est disponible
Calendar Ambos SDK de Silverlight
Canvas Ambos Motor en tiempo de ejecucin
CheckBox Ambos Motor en tiempo de ejecucin
ClassicBorderDecorator WPF No est disponible
ComboBox Ambos Motor en tiempo de ejecucin
ComboBoxItem Ambos Motor en tiempo de ejecucin
ContentControl Ambos Motor en tiempo de ejecucin
ContentPresenter Ambos Motor en tiempo de ejecucin
ContextMenu WPF No est disponible
Control Ambos SDK de Silverlight
DataPager Silverlight SDK de Silverlight
DataGrid Ambos SDK de Silverlight
DatePicker Ambos SDK de Silverlight
Decorator WPF No est disponible
DescriptionViewer Silverlight SDK de Silverlight
DockPanel Ambos Kit de herramientas de Silverlight
DocumentPageView WPF No est disponible
DocumentReference WPF No est disponible
DocumentViewer WPF No est disponible
Ellipse Ambos Motor en tiempo de ejecucin
Expander Ambos Kit de herramientas de Silverlight
FixedPage WPF No est disponible
FlowDocumentPageViewer WPF No est disponible
FlowDocumentReader WPF No est disponible
FlowDocumentScrollViewer WPF No est disponible
Frame Ambos SDK de Silverlight
FrameworkElement Ambos Motor en tiempo de ejecucin
Glyphs Ambos Motor en tiempo de ejecucin
Grid Ambos Motor en tiempo de ejecucin
GridSplitter Ambos SDK de Silverlight
GridViewColumnHeader WPF No est disponible
GridViewHeaderRowPresenter WPF No est disponible
Diferencias funcionales
Modo de ventanas
Nota:
Si est controlando la entrada de teclado (como con los eventos KeyUp y KeyDown) y casos de proceso con
teclas modificadoras, debe tener en cuenta que se podra presionar la tecla Control en Macintosh para
generar el equivalente al clic con botn secundario.
Para el control de teclado general, hay dos conjuntos de teclas. Hay un conjunto de teclas que es un comn
entre todas las plataformas compatibles y otro conjunto que vara segn la plataforma. Una tecla de
plataforma se notifica como un PlatformKeyCode. Las teclas modificadoras (se obtienen a travs de la
propiedad Keyboard.Modifiers) pueden variar segn la plataforma.
Silverlight 4 permite arrastrar una lista de archivos desde fuera del complemento Silverlight a un elemento
de destino en el rea de contenido de Silverlight. Esta caracterstica se expone a travs de eventos de
entrada, como el evento Drop de la clase UIElement. Debido a las limitaciones en el modelo de entrada de
Safari para los complementos hospedados, solo puede habilitar esta caracterstica en Safari mediante una
solucin alternativa o correcciones de compatibilidad (shim) de scripting HTML. No puede habilitar esta
caracterstica en Firefox.
Aplicaciones con ejecucin fuera del explorador
Las aplicaciones con ejecucin fuera del explorador se ejecutan de manera idntica en Windows y en
Macintosh, pero necesitan pasos de desinstalacin diferentes. En Windows, los usuarios desinstalan una
aplicacin mediante Programas y caractersticas en el Panel de control. O bien, pueden hacer clic con el
botn secundario en la aplicacin y seleccionar la opcin de desinstalacin. En Macintosh, los usuarios
desinstalan una aplicacin arrastrndola hacia la papelera.
Las aplicaciones de confianza pueden integrarse con funcionalidad nativa que difiere dependiendo del
sistema operativo host. Por ejemplo, en Windows, las aplicaciones de confianza pueden interoperar con las
API de Automatizacin a travs de la clase AutomationFactory.
Depuracin
Puede depurar aplicaciones basadas en Silverlight en equipos Macintosh estableciendo una sesin de
depuracin remota desde un equipo que est ejecutando Windows con Visual Studio instalado.
Caracterstica de .NET
Comportamiento de Windows Comportamiento de Macintosh
Framework
Convierte Char a minsculas usando En Mac OS v10.4 y en versiones
Char.ToLower(Char, CultureInfo) las convenciones de la referencia anteriores, convierte Char a
cultural especificada. minsculas usando las convenciones
2. Introduccin a Silverlight
En los temas de esta seccin se ofrece informacin detallada para comenzar a desarrollar aplicaciones
basadas en Silverlight. Se incluye informacin sobre herramientas de desarrollo, el modo de crear un
proyecto bsico en Visual Studio y vnculos a ejemplos de cdigo fuente.
Nota:
De forma predeterminada, Visual Studio 2010 incluye compatibilidad con Silverlight 3.
Al instalar Silverlight 4 Tools para Visual Studio 2010, aparecer la opcin para elegir Silverlight 4
como destino. En la siguiente ilustracin se muestra la opcin Silverlight 4 en el cuadro de dilogo
Nueva aplicacin de Silverlight.
Al crear un nuevo proyecto de Silverlight, ver un gran nmero de las herramientas y ventanas con
las que ya se ha familiarizado en Visual Studio.
SDK de Silverlight 4
El Kit de desarrollo de software (SDK) de Silverlight 4 incluye varios componentes que ayudan a crear
aplicaciones de Silverlight. El SDK de Silverlight 4 se incluye en la instalacin de Silverlight 4 Tools, pero
tambin lo puede instalar por separado. De forma predeterminada, el SDK de Silverlight 4 se instala en la
carpeta %ProgramFiles%\Microsoft SDKs\Silverlight. El SDK de Silverlight 4 contiene los elementos
siguientes.
Licencia de usuario. El documento de licencia incluye las condiciones del SDK de Silverlight 4.
Bibliotecas de Silverlight. El SDK de Silverlight 4 incluye bibliotecas de cliente y servidor. Las
bibliotecas de Silverlight no forman parte del complemento Silverlight. Las bibliotecas de cliente
incluyen las extensiones y los controles de usuario de Silverlight. Las bibliotecas de servidor
incluyen los controles de servidor de Silverlight. Para conocer las condiciones de uso, consulte la
licencia de usuario del SDK de Silverlight 4.
Herramientas. Incluye ensamblados de referencia, componentes de compilacin y herramientas
para compilar y empaquetar aplicaciones de Silverlight.
Herramienta Descripcin
Expression Blend es una herramienta para diseadores (y programadores) que
permite crear grficos, disear animaciones y generar experiencias de usuario.
Expression Blend Expression Blend utiliza XAML y el mismo sistema de proyectos que Visual Studio.
Esto permite que diseadores y programadores compartan los mismos archivos y
colaboren.
Deep Zoom Composer es una herramienta que permite preparar imgenes de alta
resolucin para usarlas con la caracterstica Deep Zoom. La nueva tecnologa Deep
Deep Zoom Zoom de Silverlight permite al usuario acercar y alejar las imgenes de manera fluida.
Composer Deep Zoom Composer permite al usuario crear archivos de composicin Deep Zoom
que controlan la experiencia de aplicar el zoom y, luego, exportar los archivos
necesarios para su implementacin con Silverlight.
Silverlight.js es un archivo auxiliar de JavaScript que se proporciona en el SDK de
Silverlight. Puede llamar a las funciones definidas en este archivo para inicializar
Silverlight.js instancias del complemento Silverlight en una pgina web. Silverlight.js tambin
contiene las funciones de utilidad para determinar la versin instalada del cliente del
complemento.
Este archivo de aplicacin auxiliar de JavaScript opcional incluye la funcin
Silverlight.supported
Silverlight.supportedUserAgent, que determina si el explorador del usuario admite
UserAgent.js
Silverlight.
Silverlight Designer para Visual Studio 2010 proporciona compatibilidad con el diseo visual para crear
aplicaciones de Silverlight y de Windows Presentation Foundation (WPF). Para construir las interfaces de
usuario de las aplicaciones, arrastre los controles del Cuadro de herramientas y establezca las propiedades
en la ventana Propiedades. Tambin puede editar directamente XAML en la vista XAML. En la ilustracin
siguiente se muestran Silverlight Designer y algunas de sus ventanas auxiliares.
Silverlight Designer
La primera vez que se inicia Silverlight Designer, las ventanas Cuadro de herramientas, Orgenes de datos y
Esquema del documento se contraen en el lado izquierdo de Visual Studio. Si se muestran y anclan las
pestaas a la izquierda, se ve la vista anterior, lo cual resulta til para usar la superficie de diseo.
Vista de diseo
La vista de diseo proporciona una superficie de diseo visual para compilar los controles de Silverlight y
para el diseo de las aplicaciones. Muestra una presentacin del XAML que hay actualmente en la vista
XAML. Cuando se cambian los controles en la superficie de diseo, la vista XAML se actualiza para reflejar
los cambios. La vista de diseo proporciona muchas caractersticas para organizar los controles de la pgina
de la aplicacin de Silverlight. En la siguiente ilustracin se muestran algunas de las caractersticas de la vista
Diseo.
Vista de diseo
Zoom
El control Zoom permite controlar el tamao de la superficie de diseo. Puede hacer zoom desde 10% hasta
20x.
Panormica
Cuando se aplica el zoom a la superficie de diseo y aparece una barra de desplazamiento horizontal o
vertical, puede aplicar la panormica para ver las partes de la superficie de diseo que estn fuera de la
pantalla. Mantenga presionada la barra espaciadora y, a continuacin, arrastre la superficie de diseo para
aplicar la panormica.
Ajustar a la vista
El botn Ajustar a la vista permite ajustar el tamao de la superficie de diseo a la pantalla disponible en la
vista de diseo. Esto resulta til si ha hecho zoom para acercarse o alejarse mucho.
Rales de la cuadrcula
Los rales de la cuadrcula se usan para administrar las filas y columnas en un control Grid. Puede crear y
eliminar columnas y filas, y puede ajustar el alto y el ancho relativos.
Lneas de la cuadrcula
Las lneas de la cuadrcula se usan para controlar el ancho y alto de las columnas y filas de un objeto Grid.
Para agregar una nueva columna o fila, haga clic en los rales situados encima y a la izquierda de Grid.
Indicadores de lnea de cuadrcula
Un indicador de lnea de cuadrcula aparece como un tringulo en el ral de la cuadrcula. Al arrastrar un
indicador de lnea de cuadrcula o la propia lnea de cuadrcula, el ancho o el alto de las columnas o filas
adyacentes se actualiza al mover el mouse.
Icono de desplazamiento
Un icono de desplazamiento aparece en la parte superior izquierda de un control de panel seleccionado y
permite mover el panel. Haga clic en el icono de desplazamiento y arrastre el control hacia la posicin
deseada en la superficie de diseo.
Asas de ajuste de tamao
Las asas de ajuste de tamao aparecen en los controles seleccionados y permiten cambiar el tamao del
control. Cuando se cambia el tamao de un control, normalmente aparecen valores de ancho y alto para
ayudar a ajustar el tamao del control con exactitud.
Lneas del margen
Los mrgenes representan la cantidad de espacio fijo comprendido entre el borde de un control y el borde
de su contenedor. Establezca los mrgenes de un control haciendo clic en las lneas del margen.
Cdigos auxiliares de margen
Un cdigo auxiliar de margen aparece en un control seleccionado cuando su margen se establece en 0.
Haga clic en el cdigo auxiliar de margen para establecer una distancia del margen respecto del borde
correspondiente del contenedor.
Lneas de ajuste
Las guas de alineacin ayudan a alinear los controles entre s. Si estn habilitadas, al arrastrar un control en
relacin con otros controles, las guas de alineacin aparecen cuando los bordes y el texto de algunos
controles estn alineados horizontal o verticalmente.
Barra de informacin
La barra de informacin aparece en la parte superior de la vista de diseo y muestra informacin sobre
cmo presentar los problemas en dicha vista. En algunos casos, puede hacer clic en la barra de informacin
para obtener informacin adicional sobre el problema.
Barra de tamao
Al mover el puntero del mouse sobre un ral de la cuadrcula para un control Grid que tiene dos o ms
columnas o filas, aparece la barra de tamao fuera del ral. La barra de tamao permite establecer las
opciones de tamao fijo, proporcional y automtico para las filas y las columnas de Grid.
Etiqueta de tamao de raz
La etiqueta de tamao de raz aparece en la parte inferior derecha de la ventana en la vista de diseo
cuando la ventana est seleccionada. Dicha etiqueta permite alternar el tamao raz de la ventana entre
automtico y fijo.
Vista XAML
El lenguaje XAML proporciona un vocabulario declarativo, basado en XML, para especificar la interfaz de
usuario de una aplicacin. Silverlight Designer proporciona una vista XAML y una vista de diseo
sincronizada del marcado XAML que presenta la aplicacin. La vista XAML incluye IntelliSense, formato
automtico, resaltado de sintaxis y navegacin por etiquetas. En la siguiente ilustracin, se muestra la vista
XAML.
Vista XAML
Propiedades (Ventana)
La ventana Propiedades permite establecer los valores de las propiedades en los controles en la vista de
diseo. En la siguiente ilustracin se muestra un ejemplo de la ventana Propiedades.
Ventana Propiedades
La parte superior de la ventana Propiedades tiene varias opciones. Para cambiar el nombre del control
seleccionado actualmente, coloque el cursor en el cuadro Nombre y escriba el nombre. En la esquina
superior derecha se muestra una vista previa en miniatura del control seleccionado actualmente. Para
enumerar las propiedades por categora o alfabticamente, haga clic en el botn Por categoras o
Alfabtico. Para ordenar las propiedades por origen, haga clic en el botn Ordenar por origen de
propiedad. Para ver la lista de eventos de un control, haga clic en el botn Eventos. Para buscar una
propiedad, empiece a escribir el nombre de esta en el cuadro Buscar. La ventana Propiedades muestra las
propiedades que coinciden con su bsqueda cuando escribe.
A la derecha del nombre de la propiedad, en la primera columna, aparece un marcador de propiedad. El
marcador de propiedad indica si se ha aplicado a la propiedad un recurso o enlace de datos. Al hacer clic en
el marcador de propiedad, puede abrir el generador de enlace de datos o el selector de recursos.
Generador de enlace de datos
El generador de enlace de datos permite crear enlaces de datos sin necesidad de escribir cdigo XAML.
Puede crear enlaces a los recursos, contextos de datos y propiedades de los elementos. Tambin puede
aplicar convertidores de valores. En la ilustracin siguiente, se muestra el generador de enlaces de datos.
Generador de enlace de datos
Selector de recursos
El selector de recursos permite buscar recursos y asignarlos a las propiedades en la ventana Propiedades.
Tambin puede extraer los valores codificados de forma rgida a los recursos para promover la reutilizacin.
En la ilustracin siguiente, se muestra el selector de recursos.
Selector de recursos
Editor de pinceles
El editor de pinceles permite crear muchos tipos distintos de pinceles en la ventana Propiedades. En la
ilustracin siguiente, se muestra el editor de pinceles.
Editor de pinceles
Una vez establecida una conexin de datos, puede arrastrar las tablas de datos a la superficie de diseo y se
generarn automticamente lgica de negocios y enlaces de datos. Se puede enlazar a un objeto, conjunto
de datos de ADO.NET, Entity Data Model o servicio.
Descripcin Tema
Crear una nueva biblioteca de clases o aplicacin de
Cmo: Crear un nuevo proyecto de Silverlight
Silverlight con Visual Studio.
Utilizar controles en una pgina. Introduccin a los controles
Crear controladores de eventos para controles. Introduccin a los controles
Manipular el diseo de las aplicaciones de Silverlight. Alineacin en Silverlight Designer
Enlazar datos con el diseador. Enlace de datos en Silverlight Designer
Extensibilidad de WPF Designer
Crear una experiencia en tiempo de diseo para los
controles de Silverlight. Ejemplos de la extensibilidad de WPF Designer y
Silverlight Designer
Crear aplicaciones y controles de WPF. WPF Designer
5. Especifique un nombre y una ubicacin para la aplicacin y, a continuacin, haga clic en Aceptar.
Aparecer el cuadro de dilogo Nueva aplicacin de Silverlight, tal y como se muestra en la
siguiente ilustracin.
Si activa la casilla Hospedar la aplicacin de Silverlight en un nuevo sitio web en el cuadro de dilogo
Nueva aplicacin de Silverlight, se crea y se agrega a la solucin de Silverlight un sitio web ASP.NET. El
sitio web contiene los archivos siguientes:
Silverlight.js
Un archivo auxiliar de JavaScript que contiene funciones para inicializar instancias de complemento
Silverlight y funciones para determinar la versin instalada del cliente del complemento.
Archivo HTML
Un archivo HTML que se utiliza para configurar y crear instancias del complemento Silverlight, que
descarga y ejecuta la aplicacin de Silverlight. El nombre de este archivo es una concatenacin del
nombre del proyecto de aplicacin de Silverlight y el texto "TestPage.html".
Archivo .aspx
Archivo .aspx que es la pgina web de inicio predeterminada. El nombre de este archivo es una
concatenacin del nombre del proyecto de aplicacin de Silverlight y el texto "TestPage.aspx".
Web.config
Archivo de configuracin del sitio web
Class1.cs o Class1.vb
El archivo de cdigo para una clase nica denominada Class1.
Nota:
Para excluir el ensamblado al que se hace referencia en el paquete de la aplicacin, seleccione la referencia
de ensamblado y, a continuacin, en la ventana Propiedades, establezca Copia local en Falso. Esto es til
cuando se desear recuperar el ensamblado a peticin.
Para utilizar el ensamblado en XAML, tiene que especificar una asignacin del espacio de nombres XML.
Para agregar una asignacin de espacio de nombres XML
1. Abra MainPage.xaml.
2. En la etiqueta de apertura <UserControl>, agregue el marcado para declarar un espacio de
nombres. Por ejemplo, agregara el siguiente marcado para utilizar DataGrid.
xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
3. Para utilizar el elemento en XAML, prefije el nombre con el nombre especificado en la asignacin
del espacio de nombres XML. Por ejemplo, en XAML, el elemento DataGrid se parecera a lo
siguiente:
<sdk:DataGrid></sdk:DataGrid>
Requisitos previos
Necesita los componentes siguientes para completar este tutorial:
Visual Studio 2010.
Silverlight 4 Tools para Visual Studio 2010.
Esta propiedad especifica que se agreguen lneas para identificar las filas y columnas de Grid. Esta
caracterstica de depuracin resulta de gran utilidad a la hora de crear los diseos de Grid.
4. Dentro del elemento Grid, agregue el siguiente cdigo XAML para definir tres filas y dos columnas.
<Grid x:Name="LayoutRoot" Background="Beige" ShowGridLines="True">
<Grid.RowDefinitions>
<RowDefinition Height="40"/>
<RowDefinition Height="220"/>
<RowDefinition Height="40"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="75" />
<ColumnDefinition Width="325"/>
</Grid.ColumnDefinitions>
</Grid>
En la vista de diseo, ve que aparecen lneas que identifican las filas y columnas.
5. Presione F5 o haga clic en el botn de barra de herramientas Iniciar depuracin para ejecutar la
aplicacin.
El explorador se abrir y ver lneas de puntos que indican el Grid que defini, como se muestra en
la siguiente ilustracin.
Agregar controles
Silverlight incluye varios controles para ayudarle a mostrar los datos y obtener los datos introducidos por el
usuario. En esta seccin se describe cmo agregar controles TextBlock, TextBox, StackPanel, Calendar y
Button al diseo de Grid.
Para agregar controles
1. Abra la ventana Cuadro de herramientas, si an no est abierta.
4. Detrs del control TextBlock denominado Name, agregue otro control de tipo TextBlock con
Text="Date:".
5. Detrs del control TextBlock denominado Date, agregue otro control de tipo TextBlock con
Text="Message:".
En la vista de diseo, puede ver que los elementos TextBlock se superponen entre s en la primera
celda. Para colocar los controles TextBlock en celdas Grid, debe especificar las propiedades
Grid.Row y Grid.Column.
6. En la etiqueta de apertura del control TextBlock Name, agregue las propiedades siguientes.
Grid.Row="0" Grid.Column="0"
8. En la etiqueta de apertura del control de tipo TextBlock denominado Message, agregue las
propiedades siguientes.
Grid.Row="2" Grid.Column="0"
En la vista de diseo, los elementos TextBlock se colocan ahora en las celdas adecuadas.
10. En el cuadro de herramientas, arrastre un control TextBox Message justo detrs del mensaje
TextBlock en la vista XAML.
11. En la etiqueta de apertura, defina las propiedades siguientes.
<TextBox Text="Your Name" Grid.Row="0" Grid.Column="1"></TextBox>
Observe que TextBox rellena toda la celda Grid. Rellena la celda porque las propiedades
VerticalAlignment y HorizontalAlignment estn establecidas en "Stretch" (ajustada) de forma
predeterminada.
14. Debajo del control TextBox denominado Your Name, arrastre un control StackPanel desde el
cuadro de herramientas hasta la vista XAML.
StackPanel es un control til para apilar los elementos vertical u horizontalmente. En la celda de la
cuadrcula de Grid situada bajo el control Name de tipo TextBox, apilar dos controles
verticalmente.
15. En la etiqueta de apertura del control de tipo StackPanel, agregue las propiedades siguientes.
<StackPanel Grid.Column="1" Grid.Row="1" Orientation="Vertical">
</StackPanel>
16. En el cuadro de herramientas, arrastre un control Calendar al interior del elemento StackPanel en la
vista XAML.
Al agregar el control Calendar, observar que el nombre de la etiqueta es algo diferente del de los
dems controles. Lleva el prefijo "sdk:". El control Calendar no forma parte de los controles bsicos
de Silverlight y se implementa en un ensamblado diferente. El control Calendar forma parte del SDK
de Silverlight. Para usar los controles del SDK de Silverlight, debe agregar un espacio de nombres
XML y una referencia al ensamblado. Al arrastrar un control del SDK de Silverlight hasta la vista
XAML o de diseo, se agrega automticamente un espacio de nombres XML al principio del archivo
MainPage.xaml, en la etiqueta <UserControl>. Tal y como se puede ver en el siguiente marcado, el
espacio de nombres sdk utiliza un identificador URI concreto, lo cual se describe en Prefijos y
asignaciones para las bibliotecas de Silverlight.
<UserControl xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
18. En el cuadro de herramientas, arrastre un control Button justo detrs del control Calendar, pero
dentro del elemento StackPanel en la vista XAML.
Puesto que la propiedad Orientation del control StackPanel est establecida en Vertical, el control
de tipo Button aparecer bajo el control Calendar.
19. En la etiqueta de apertura del control Button, establezca las propiedades Width, Height,
HorizontalAlignment y Content.
<Button Width="75" Height="25" HorizontalAlignment="Left" Content="OK"></Button>
Un control Button no incluye ninguna propiedad Text, pero s que incluye una propiedad Content.
El control Button tiene una propiedad Content porque realmente pueden agregarse otros
elementos como contenido de Button, tales como imgenes u otros controles.
20. En el men Archivo, haga clic en Guardar todo.
Llegados a este punto, podemos decir que se han agregado todos los controles. El cdigo XAML
ser similar al siguiente.
<UserControl
xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
x:Class="HelloSilverlight.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="400" d:DesignHeight="300">
<Grid x:Name="LayoutRoot" Background="Beige" ShowGridLines="True">
<Grid.RowDefinitions>
<RowDefinition Height="40"/>
<RowDefinition Height="220"/>
<RowDefinition Height="40"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="75" />
<ColumnDefinition Width="325"/>
</Grid.ColumnDefinitions>
<TextBlock Text="Name:" Grid.Row="0" Grid.Column="0"></TextBlock>
<TextBlock Text="Date:" Grid.Row="1" Grid.Column="0"></TextBlock>
<TextBlock Text="Message:" Grid.Row="2" Grid.Column="0"
Grid.ColumnSpan="2"></TextBlock>
<TextBox Text="Your Name" Grid.Row="0" Grid.Column="1"
Width="150" HorizontalAlignment="Left"></TextBox>
<StackPanel Grid.Column="1" Grid.Row="1" Orientation="Vertical">
<sdk:Calendar SelectionMode="SingleDate"
HorizontalAlignment="Left"></sdk:Calendar>
<Button Width="75" Height="25"
HorizontalAlignment="Left" Content="OK"></Button>
</StackPanel>
</Grid>
</UserControl>
Agregar cdigo
Los archivos de cdigo subyacente permiten agregar lgica a los elementos definidos mediante XAML. Para
obtener acceso a los controles y a otros elementos mediante programacin, es necesario asignar un nombre
a los elementos. En esta seccin se describe cmo asignar un nombre a los elementos en XAML, cmo
agregar un controlador de eventos y cmo agregar lgica al archivo de cdigo subyacente.
Para agregar cdigo
1. En la vista XAML, busque el control Message de tipo TextBlock .
2. En la etiqueta de apertura del control Message de tipo TextBlock, agregue la siguiente propiedad
Name message1.
x:Name="message1"
4. En la etiqueta de apertura del control OK de tipo Button, escriba Click y, a continuacin, presione
TAB.
Deber aparecer una ventana de IntelliSense, tal y como se muestra en la ilustracin siguiente.
El ajuste de tamao Auto indica que el tamao viene determinado por el contenido. El ajuste de
tamao Star (*) indica que el tamao es una proporcin ponderada del espacio restante.
2. En el elemento Grid.ColumnDefinitions, cambie los valores de Width por los siguientes.
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*"/>
3. Agregue la siguiente propiedad Margin a los controles de tipo TextBlock Name, Date y Message.
El siguiente cdigo indica que se agregue un margen de 10 pxeles a izquierda y derecha, y un
margen de 5 pxeles arriba y abajo.
Margin="10,5,10,5"
5. Agregue la siguiente propiedad FontSize al control Message de tipo TextBlock para aumentar el
tamao de la fuente.
FontSize="20"
Si se utiliza Expression Blend, los grficos se crearn visualmente en el diseador. Si se utiliza Visual Studio,
los grficos se crearn mediante cdigo XAML. Una vez creados los grficos que componen la apariencia
del reloj, se agregarn animaciones y lgica para que el reloj funcione.
Requisitos previos
Necesita los componentes siguientes para completar este tutorial:
Expression Blend 4 (opcional).
Visual Studio 2010.
Silverlight 4.
Estos grficos se crean con elementos simples organizados en un control Grid. Todos los grficos circulares,
incluidos los grficos de la cara de reloj, el borde exterior, el bisel y la sombra, se crean con elementos
Ellipse, mientras que las manecillas del reloj se crean con elementos Rectangle.
Para crear un nuevo proyecto de aplicacin de Silverlight en Expression Blend
1. Inicie Expression Blend. Si aparece el formulario de inicio, haga clic en Cerrar.
2. En el men Archivo, haga clic en Nuevo proyecto.
Aparecer el cuadro de dilogo Nuevo proyecto.
3. En el recuadro Tipos de proyecto, seleccione Silverlight.
4. En la lista de proyectos, seleccione Aplicacin de Silverlight.
2. En la mesa de trabajo, dibuje una elipse de unos 330 pxeles de ancho y de alto. Mientras dibuja,
presione la tecla MAYS para mantener el ancho y el alto iguales.
3. Si necesita cambiar la posicin de la elipse, en el panel Herramientas, haga clic en la herramienta
Seleccin y cambie la elipse de posicin.
5. En el panel Propiedades, en Pinceles, haga clic en Relleno y, a continuacin, haga clic en Pincel
de color slido.
6. En el Editor de colores, establezca el color en negro.
Ahora, la elipse tiene un relleno de color negro semitransparente que proporcionar el efecto de
sombra.
8. En el men Archivo, haga clic en Guardar todo.
A continuacin, va a crear el borde exterior del reloj. Dado que el borde exterior tiene el mismo tamao que
la elipse de sombra, podr crearlo copiando simplemente la elipse de sombra.
Para crear el borde exterior del reloj
1. En el panel Herramientas, haga clic en la herramienta Seleccin.
2. En la mesa de trabajo, haga clic en la elipse de sombra para asegurarse de que est seleccionada.
3. En el men Edicin, seleccione Copiar o presione CTRL+C.
4. En el men Edicin, seleccione Pegar o presione CTRL+V.
Aparecer una nueva elipse denominada shadowEllipse_Copy justo encima de la elipse de sombra.
5. En el panel Propiedades, establezca el nombre en outerRimEllipse.
A continuacin, va a cambiar la direccin del degradado lineal para que fluya de la parte superior
izquierda a la parte inferior derecha (en lugar de fluir de izquierda a derecha sobre la elipse).
11. En el panel Herramientas, haga clic en la herramienta Degradado.
A continuacin, va a crear el bisel del reloj. La elipse que va a usar para crear el bisel es similar a
outerRimEllipse, pero algo ms pequea.
Para crear el bisel del reloj
1. Seleccione la elipse outerRimEllipse.
2. Cree una copia de outerRimEllipse y pguela.
3. En el panel Propiedades, establezca el nombre de la copia de outerRimEllipse en bevelEllipse.
4. En el panel Propiedades, en Diseo, establezca el valor de Ancho y de Alto en 290.
A continuacin, va a rellenar bevelEllipse con un degradado lineal. Dado que bevelEllipse es una
copia de outerRimEllipse, ya tendr aplicado un degradado.
5. En el panel Propiedades, en Pinceles, haga clic en el punto de degradado izquierdo y establezca
su color en #FF2F2F32.
6. Haga clic en el punto de degradado derecho y establezca su color en #FFE4E5F4.
7. Arrastre el punto de degradado derecho hacia la derecha hasta que sea del 100%.
Este degradado fluye en la misma direccin que el degradado aplicado a outerRimEllipse. Sin
embargo, el degradado de bevelEllipse pasa de oscuro en la parte superior izquierda a claro en la
parte inferior derecha, que es lo contrario de lo que ocurre con el degradado aplicado a
outerRimEllipse. En la ilustracin siguiente, se muestra el degradado.
A continuacin, crear la cara del reloj. La elipse que va a usar para crear la cara es similar a bevelEllipse,
pero algo ms pequea.
Para crear la cara del reloj
1. Seleccione la elipse bevelEllipse.
2. Cree una copia de bevelEllipse y pguela.
3. En el panel Propiedades, establezca el nombre de la copia de bevelEllipse en faceEllipse.
4. En el panel Propiedades, en Diseo, establezca el valor de Ancho y de Alto en 270.
5. En el panel Propiedades, en Pinceles, haga clic en Relleno, haga clic en Pincel de color slido y, a
continuacin, establezca el color en negro.
Observe que, al agregar esta elipse, el bisel se vuelve visible.
9. En el men Objeto, haga clic en Alinear y, a continuacin, haga clic en Centros horizontales.
La elipse centerEllipse est alineada horizontalmente.
10. En el men Objeto, haga clic en Alinear y, a continuacin, haga clic en Centros verticales.
La elipse centerEllipse est alineada verticalmente.
1. En el panel Herramientas, haga clic con el botn secundario en la herramienta Elipse y haga clic
en la herramienta Rectngulo.
2. En la cara del reloj, dibuje un rectngulo grande y estrecho que represente la posicin de las 12 en
punto.
3. En el panel Propiedades, establezca el nombre en secondHand.
4. En el panel Propiedades, en Pinceles, haga clic en Relleno, haga clic en Pincel de color slido y, a
continuacin, establezca el color en rojo.
5. En el panel Propiedades, en Diseo, establezca el valor de Ancho en 5 y el valor de Alto en 80.
6. En el panel Objetos y escala de tiempo, seleccione secondHand, presione la tecla CTRL y, a
continuacin, seleccione faceEllipse.
7. En el men Objeto, haga clic en Alinear y, a continuacin, haga clic en Centros horizontales.
8. En el panel Herramientas, haga clic en la herramienta Seleccin.
9. En el panel Objetos y escala de tiempo, haga clic en secondHand para seleccionar el rectngulo
secondHand.
10. En la esquina inferior izquierda de la mesa de trabajo, haga clic en la flecha Zoom para acercar el
rectngulo secondHand.
En el paso siguiente, va a cambiar el punto central del rectngulo al centro de la cara del reloj. Ms
adelante, animar las manecillas del reloj alrededor del centro del reloj.
11. Arrastre el punto central del rectngulo secondHand hasta el centro de la cara del reloj.
12. Cree un segundo rectngulo que represente el minutero con las siguientes propiedades.
o Nombre = minuteHand
o Relleno, Pincel de color slido, verde
o Ancho = 9, Alto = 80
o Alinear centros horizontalmente
o Punto central establecido en el centro de la cara del reloj
13. Cree un tercer rectngulo que represente el horario con las siguientes propiedades.
o Nombre = hourHand
o Relleno, Pincel de color slido, verde
o Ancho = 11, Alto = 60
o Alinear centros horizontalmente
o Punto central establecido en el centro de la cara del reloj
Cuando termine, las manecillas del reloj estarn una encima de la otra.
En la siguiente seccin, va a agregar animaciones para que las manecillas giren alrededor del reloj.
Esto lo har animando la propiedad Angle del elemento RotateTransform que se aplica a la
manecilla del reloj. Dado que la animacin deber tener como destino la transformacin
RotateTransform correcta, tendr que asignar un nombre a los elementos RotateTransform
aplicados a cada una de las manecillas del reloj. No se puede cambiar el nombre de los elementos
RotateTransform en la interfaz de usuario de Expression Blend, por lo que habr que hacerlo en
cdigo XAML.
14. En la esquina superior derecha de la mesa de trabajo, haga clic en la pestaa Vista XAML o Vista
en dos paneles.
Ahora podr ver el marcado XAML de todos los objetos que ha creado en el diseador. Las
manecillas del reloj se crean con elementos Rectangle.
15. Busque el rectngulo secondHand en el cdigo XAML.
16. Modifique el rectngulo secondHand agregando un elemento Rectangle.RenderTransform y un
elemento RotateTransform denominado secondHandTransform, tal y como se muestra en el
siguiente cdigo XAML.
<!-- Second Hand -->
<Rectangle x:Name="secondHand" ...>
<Rectangle.RenderTransform>
<RotateTransform x:Name="secondHandTransform"/>
</Rectangle.RenderTransform>
</Rectangle>
19. En la esquina superior derecha, haga clic en la pestaa Vista de diseo para mostrar la vista de
diseo.
20. Guarde el proyecto.
Una vez llegado a este punto, ya ha creado todos los grficos del reloj. A continuacin, va a aplicar
animaciones a las transformaciones de giro de las manecillas del reloj. Estas animaciones de giro harn que
las manecillas del reloj giren alrededor del centro del reloj (tal y como se espera que hagan las manecillas
del reloj). Controlando el tiempo de las animaciones, puede hacer que las manecillas giren alrededor del
reloj en sincronizacin con la hora actual del equipo.
Para agregar animaciones a las manecillas del reloj
1. Muestre el panel Proyectos.
2. Asegrese de que est seleccionado MainPage.xaml.
3. Haga clic en la pestaa Vista XAML o Vista en dos paneles para mostrar el cdigo XAML.
4. Despus del elemento inicial UserControl, escriba el cdigo siguiente para agregar animaciones a
las manecillas del reloj.
<UserControl.Resources>
<Storyboard x:Name="clockStoryboard">
<!-- This animation targets the hour hand transform -->
<DoubleAnimation x:Name="hourAnimation"
Storyboard.TargetName="hourHandTransform"
Storyboard.TargetProperty="Angle"
Este marcado define un objeto Storyboard que contiene las animaciones que animan las manecillas
del reloj. Todas estas animaciones hacen referencia a la propiedad Angle de la correspondiente
transformacin de la manecilla del reloj. La propiedad Duration de cada animacin se establece
dependiendo de la velocidad deseada de la animacin. Por ejemplo, para la transformacin del
horario, la duracin de la animacin se establece en 12 horas, que es el tiempo que tarda la
manecilla de la hora en recorrer el reloj completamente. RepeatBehavior para todas las animaciones
se establece en "Forever". Por consiguiente, cuando la animacin se completa (la manecilla da una
vuelta completa al reloj), vuelve a empezar de nuevo y se repite indefinidamente.
Para iniciar el objeto Storyboard, va a usar el evento Loaded para llamar al mtodo Begin del objeto
Storyboard.
5. Busque el elemento Grid y agregue el siguiente atributo Loaded.
De este modo, se especifica que se debe llamar al controlador de eventos SetAndStartClock cuando
se carga la aplicacin.
<Grid x:Name="LayoutRoot" Background="White" Loaded="SetAndStartClock">
8. Guarde el proyecto.
9. Haga clic en el men Proyecto y, a continuacin, haga clic en Ejecutar proyecto para compilar y
ejecutar la aplicacin. (Tambin puede presionar F5 para ejecutar la aplicacin.)
Se abrir el explorador web y el reloj comenzar a funcionar. Observe que el segundero se est
moviendo alrededor del reloj. Las otras manecillas tambin se estn moviendo, pero lo estn
haciendo tan despacio que no es perceptible.
Aunque las manecillas del reloj se estn moviendo a la velocidad esperada, el reloj no est ajustado en la
hora actual. Para ajustar el reloj, deber agregar cierta lgica.
Para establecer el reloj en la hora actual
1. Cierre el explorador y abra MainPage.xaml.vb o MainPage.xaml.cs.
2. En lugar del procedimiento de SetAndStartClock, escriba el cdigo que figura a continuacin.
Con este cdigo, se establecen las manecillas del reloj en la hora actual.
Private Sub SetAndStartClock(ByVal sender As Object, ByVal e As EventArgs)
' The current date and time.
Dim currentDate As Date = DateTime.Now
' Find the appropriate angle (in degrees) for the hour hand
' based on the current time.
Dim hourangle As Double = (((CType(currentDate.Hour, Single) / 12) * 360) + (currentDate.Minute / 2))
3. Ejecute la aplicacin.
Ahora, las manecillas del reloj deben sealar la hora actual.
Estos grficos se crean con elementos simples organizados en un control Grid. Todos los grficos circulares,
incluidos los grficos de la cara de reloj, el borde exterior, el bisel y la sombra, se crean con elementos
Ellipse, mientras que las manecillas del reloj se crean con elementos Rectangle.
Para crear un nuevo proyecto de aplicacin de Silverlight en Visual Studio 2008
1. Inicie Visual Studio.
2. Cree un nuevo proyecto de aplicacin de Silverlight denominado SilverlightClock en Visual Basic o
Visual C#.
3. En el cuadro de dilogo Nueva aplicacin de Silverlight, desactive la casilla Hospedar la
aplicacin de Silverlight en un nuevo sitio web y, en la lista Versin de Silverlight, seleccione
Silverlight 4.
Los grficos del reloj se componen de capas de formas superpuestas, que crean la apariencia general de un
reloj. Para crear el reloj, deber construirlo capa por capa, comenzando por la capa inferior, que es la
sombra del reloj.
Para crear la sombra del reloj
1. Abra MainPage.xaml.
2. Reemplace el XAML existente por el siguiente XAML para crear la sombra del reloj.
<UserControl x:Class="SilverlightClock.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
Observe que el relleno se establece en negro y la opacidad se establece en 0,3 (30%). Esto hace que
el relleno de la elipse sea semitransparente, como una sombra. El ancho, el alto y el margen son
arbitrarios. Estas propiedades simplemente especifican el tamao y la posicin del crculo dentro
del control Grid.
Nota:
El lenguaje de procedimientos utilizado (por ejemplo, Visual Basic, C# o JavaScript) no afecta a la
mayor parte del marcado XAML en las aplicaciones de Silverlight.
La elipse de sombra est colocada ligeramente hacia la parte inferior derecha de modo que solo se
ve un fragmento de esa elipse. Esto produce un efecto de sombra. Adems, observe que se ha
aplicado un degradado lineal a la elipse del borde exterior. Este degradado lineal sirve para crear
un efecto de luz procedente de la parte superior izquierda de la elipse.
A continuacin, agregar el bisel del reloj.
Esta elipse tiene un tamao ligeramente inferior que la elipse utilizada para crear el borde exterior y
se encuentra directamente sobre la elipse del borde exterior. Adems, esta elipse tambin tiene
aplicado un degradado lineal, pero este degradado pasa de oscuro en la parte superior izquierda a
claro en la parte inferior derecha.
A continuacin, crear la cara del reloj.
Para crear la cara del reloj
En MainPage.xaml, despus de la elipse del bisel, agregue el siguiente cdigo XAML para crear la
cara del reloj.
<!-- Face -->
<Ellipse Fill="#FF000000" Height="270" Margin="65,65,65,65"
Stroke="#FF000000" Width="270" />
La cara del reloj es simplemente una elipse rellena de negro, de tamao ligeramente inferior al de
la elipse del bisel y colocada directamente sobre las dems elipses. Observe tambin que, al
agregar esta elipse, el bisel se vuelve visible.
En el cdigo anterior, el minutero, el horario y el segundero comparten los mismos valores para las
propiedades que determinan la posicin (por ejemplo, Margin). No obstante, las manecillas difieren
entre s en lo que se refiere al tamao y/o color (por ejemplo, el horario es el ms grueso porque
tiene el valor StrokeThickness ms elevado).
Observe que todas las manecillas tienen aplicada una transformacin RotateTransform. Esta
transformacin permite girar el ngulo de la manecilla. En la seccin siguiente, animar el ngulo
de esta transformacin, que har que las manecillas del reloj se muevan para mostrar la hora. Cada
uno de los elementos RotateTransform tiene un nombre (por ejemplo,
x:Name="hourHandTransform"). De este modo, puede asociar una animacin a la transformacin.
Adems, tenga en cuenta que todas las manecillas tienen un valor RenderTransformOrigin. Esta
propiedad se usa para especificar el punto del lienzo con respecto al que todas las
transformaciones son relativas. Puesto que va a girar las manecillas alrededor del centro del reloj, el
valor de la propiedad RenderTransform para todas las manecillas se proporciona como centro de la
cara del reloj.
Una vez llegado a este punto, ya ha creado todos los grficos del reloj. A continuacin, va a aplicar
animaciones a las transformaciones de giro de las manecillas del reloj. Estas animaciones de giro harn que
las manecillas del reloj giren alrededor del centro del reloj (tal y como se espera que hagan las manecillas
del reloj). Controlando el tiempo de las animaciones, puede hacer que las manecillas giren alrededor del
reloj en sincronizacin con la hora actual del equipo.
Para agregar animaciones a las manecillas del reloj
1. En MainPage.xaml, despus del elemento inicial UserControl, escriba el cdigo siguiente para
agregar animaciones a las manecillas del reloj.
<UserControl.Resources>
<Storyboard x:Name="clockStoryboard">
<!--This animation targets the hour hand transform-->
<DoubleAnimation x:Name="hourAnimation"
Storyboard.TargetName="hourHandTransform"
Storyboard.TargetProperty="Angle"
Este marcado define un objeto Storyboard que contiene las animaciones que animan las manecillas
del reloj. Todas estas animaciones de Storyboard hacen referencia a la propiedad Angle de la
transformacin de la manecilla del reloj correspondiente. La propiedad Duration de cada animacin
se establece dependiendo de la velocidad deseada de la animacin. Por ejemplo, para la
transformacin del horario, la duracin de la animacin se establece en 12 horas, que es el tiempo
que tarda la manecilla de la hora en recorrer el reloj completamente. RepeatBehavior para todas las
animaciones se establece en "Forever". Por consiguiente, cuando la animacin se completa (la
manecilla da una vuelta completa al reloj), vuelve a empezar de nuevo y se repite indefinidamente.
Para iniciar el objeto Storyboard, use el evento Loaded a fin de llamar al mtodo Begin del objeto
Storyboard.
2. En el elemento Grid, agregue el siguiente atributo Loaded.
De este modo, se especifica que se debe llamar al controlador de eventos SetAndStartClock cuando
se carga la aplicacin.
<Grid x:Name="LayoutRoot" Loaded="SetAndStartClock">
5. Guarde el proyecto.
6. En el men Depurar, haga clic en Iniciar depuracin o presione F5 para ejecutar la aplicacin.
Se abrir el explorador web y el reloj comenzar a funcionar. Observe que el segundero se est
moviendo alrededor del reloj. Las otras manecillas tambin se estn moviendo, pero lo estn
haciendo tan despacio que no es perceptible.
Aunque las manecillas del reloj se estn moviendo a la velocidad esperada, el reloj no est ajustado en la
hora actual. Para ajustar el reloj, deber agregar cierta lgica.
Para establecer el reloj en la hora actual
1. Cierre el explorador y abra MainPage.xaml.vb o MainPage.xaml.cs.
2. En lugar del procedimiento de SetAndStartClock, escriba el cdigo que figura a continuacin.
Con este cdigo, se establecen las manecillas del reloj en la hora actual.
Private Sub SetAndStartClock(ByVal sender As Object, ByVal e As EventArgs)
' The current date and time.
Dim currentDate As Date = DateTime.Now
' Find the appropriate angle (in degrees) for the hour hand
' based on the current time.
Dim hourangle As Double = (((CType(currentDate.Hour, Single) / 12) * 360) + (currentDate.Minute / 2))
' The same as for the minute angle.
3. Ejecute la aplicacin.
Ahora, las manecillas del reloj deben sealar la hora actual.
Conclusin
En este tutorial, ha aprendido a hacer lo siguiente en Silverlight:
Disear grficos vectoriales superpuestos que simulan el aspecto de un reloj real.
Usar degradados para crear sombreado y profundidad.
Usar animaciones para agregar funcionalidad al reloj.
Usar cdigo para ajustar la hora correcta del reloj.
Obtenga informacin sobre cmo utilizar Expression Blend y Visual Studio para crear aplicaciones
de Silverlight.
Requisitos previos
Se necesitan los siguientes componentes para compilar el Editor de texto de Silverlight:
Silverlight 4.
Silverlight 4 Tools para Visual Studio 2010.
Visual Studio 2010.
Barra de herramientas
La barra de herramientas se hospeda en un control Grid denominado ToolBarGrid. El control ToolBarGrid
tiene dos filas y siete columnas. La primera fila no tiene ningn elemento secundario y se utiliza para
agregar relleno a la segunda fila. En la segunda fila se hospedan los botones de la barra de herramientas.
Cada columna hospeda una seccin de la barra de herramientas, por ejemplo, Portapapeles, Fuente, etc.
Considere una seccin de la barra de herramientas como ejemplo. La segunda columna del control
ToolBarGrid (Grid.Column = 1) hospeda la seccin Fuente de la barra de herramientas. Esta seccin consta
de siete controles. En la siguiente tabla, se muestran los elementos de la seccin Fuente y el control que se
utiliza para crear cada elemento.
La posicin de los controles ComboBox usados para crear el nombre de fuente y el tamao de fuente se
define estableciendo un valor de margen adecuado. La posicin de los controles Button y del control
ComboBox para el color de fuente se determina utilizando un diseo de StackPanel con orientacin
horizontal. La posicin del control TextBlock para el ttulo de la seccin se define con un valor de margen
adecuado. En el siguiente XAML, se muestra la seccin Fuente de la barra de herramientas.
<!--Fonts Toolbar Section-->
<ComboBox x:Name="cmbFonts" ...
<ComboBoxItem Content="Arial" ...
<ComboBoxItem Content="Arial Black" ...
...
</ComboBox>
<ComboBox x:Name="cmbFontSizes"
<ComboBoxItem Content="8" Tag="8"/>
<ComboBoxItem Content="9" Tag="9"/>
...
</ComboBox>
<StackPanel Grid.Column="1" Grid.Row="1" ...
<!--Buttons-->
<Button x:Name="btnBold" ...
<Button x:Name="btnItalic" ...
<Button x:Name="btnUnderline" ...
<ComboBox x:Name="cmbFontColors" ...
<ComboBoxItem Tag="FFFF0000">
<ComboBoxItem Tag="FF008000">
...
</ComboBox>
</StackPanel>
Editor
El editor se hospeda en un control Grid denominado RTBGrid. En la siguiente tabla, se muestran los
elementos secundarios de RTBGrid.
Elemento
Nombre Descripcin
secundario
Rectangle Se utiliza como borde alrededor del control RichTextBox.
RichTextBox rtb Se utiliza para escribir y modificar contenido enriquecido.
Canvas highlightCanvas Se utiliza al hacer clic en el botn Resaltar de la barra de herramientas.
Se utiliza para que se muestre el cdigo XAML al hacer clic en el botn
XAML de la barra de herramientas. Este control TextBox est oculto de
TextBox xamlTB
forma predeterminada y se muestra nicamente cuando se hace clic en el
botn XAML de la barra de herramientas.
Portapapeles
Es posible cortar, copiar o pegar un texto seleccionado en el editor mediante los botones Cortar, Copiar o
Pegar situados en la seccin Portapapeles de la barra de herramientas. Esto se implementa mediante el
nuevo objeto Clipboard de Silverlight 4, tal y como se muestra en el siguiente cdigo.
//Cut the selected text
private void btnCut_Click(object sender, RoutedEventArgs e)
{
Clipboard.SetText(rtb.Selection.Text);
rtb.Selection.Text = "";
ReturnFocus();
}
//Copy the selected text
private void btnCopy_Click(object sender, RoutedEventArgs e)
{
Clipboard.SetText(rtb.Selection.Text);
ReturnFocus();
}
//paste the text
private void btnPaste_Click(object sender, RoutedEventArgs e)
{
rtb.Selection.Text = Clipboard.GetText();
ReturnFocus();
}
Men contextual
Asimismo, es posible cortar, copiar y pegar un texto seleccionado mediante un men contextual. El men
contextual aparece cuando se hace clic con el botn secundario del mouse en el editor. Los eventos que se
producen al hacer clic con el botn secundario del mouse son una caracterstica nueva de Silverlight 4. En la
siguiente ilustracin se muestra el men contextual.
El men contextual se implementa mediante el control Popup. La lgica del men contextual se encuentra
fundamentalmente en los archivos ContextMenu.cs y RTBContextMenu.cs del proyecto.
ContextMenu es una clase abstracta que proporciona la funcionalidad bsica para crear, mostrar y cerrar un
men contextual. Es posible derivar de esta clase base para crear cualquier men contextual que se desee.
La clase ContextMenu proporciona las siguientes funcionalidades:
Define un mtodo abstracto denominado GetContent.
La clase derivada debe implementar el mtodo GetContent para crear el contenido deseado del
men contextual. El mtodo GetContent devuelve un objeto FrameworkElement que tiene el
contenido del men contextual.
_isShowing = true;
_location = location;
ConstructPopup();
_popup.IsOpen = true;
}
Controla el evento MouseLeftButtonUp para las operaciones de cortar, copiar y pegar cuando se
hace clic en los correspondientes botones del men contextual. En el siguiente cdigo, se muestran
los controladores de eventos para las operaciones de cortar, copiar y pegar.
//handle the cut, copy and paste actions when the appropriate button on the context menu is clicked.
void cut_MouseLeftButtonUp(object sender, RoutedEventArgs e)
{
Clipboard.SetText(rtb.Selection.Text);
rtb.Selection.Text = "";
Close();
}
void copy_MouseLeftButtonUp(object sender, RoutedEventArgs e)
{
Clipboard.SetText(rtb.Selection.Text);
Close();
}
void paste_MouseLeftButtonUp(object sender, RoutedEventArgs e)
{
rtb.Selection.Text = Clipboard.GetText();
Close();
}
Fuente
El ejemplo del editor de texto de Silverlight permite aplicar a un texto seleccionado los formatos de negrita,
cursiva, subrayado, tipo de fuente, tamao de fuente y color de fuente. Para usar un formato de fuente, se
aplica el mtodo TextSelection.ApplyPropertyValue al texto seleccionado en el control RichTextBox con la
propiedad de dependencia y el valor de propiedad apropiados. En la siguiente tabla, se resumen la
propiedad de dependencia y el valor de propiedad que se pueden usar para aplicar el formato de fuente.
Formato de Propiedad de
Valor de propiedad
fuente dependencia
Se usa la propiedad FontWeights.Bold para aplicar el formato de
negrita al texto seleccionado. Se usa
Negrita FontWeightProperty
la propiedad FontWeights.Normal para quitar el formato de
negrita del texto seleccionado.
Se usa la propiedad FontStyles.Italic para aplicar el formato de
cursiva al texto seleccionado.
Cursiva FontStyleProperty
Se usa la propiedad FontStyles.Normal para quitar el formato de
cursiva del texto seleccionado.
En el siguiente cdigo, se muestra cmo se aplica el formato de fuente en el ejemplo del editor de texto de
Silverlight.
RichNotepadSnippets#Font1, Font2
Insertar
Es posible insertar elementos como imgenes, hipervnculos, cuadrculas de datos y calendarios en el
ejemplo del editor de texto de Silverlight.
El botn Insertar imagen permite insertar una imagen en la ubicacin actual del editor. Primero, se crea la
imagen con un objeto Image que apunta a un identificador URI que especifica la ubicacin de la imagen. A
continuacin, se inserta la imagen en el control RichTextBox mediante un objeto InlineUIContainer. En este
ejemplo, se inserta una imagen denominada desert.jpg que se almacena como un recurso del proyecto. Sin
embargo, es posible insertar cualquier otra imagen pasando el identificador URI adecuado.
En el siguiente cdigo, se muestra cmo se inserta una imagen.
'Insert an image into the RichTextBox
Private Sub btnImage_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
Dim container As InlineUIContainer = New InlineUIContainer
container.Child = MainPage.createImageFromUri(New Uri("/RichNotepad;component/images/Desert.jpg",
UriKind.RelativeOrAbsolute), 200, 150)
rtb.Selection.Insert(container)
'ReturnFocus()
End Sub
Private Shared Function createImageFromUri(ByVal URI As Uri, ByVal width As Double, ByVal height As Double) As Image
Dim img As Image = New Image
img.Stretch = Stretch.Uniform
img.Width = width
img.Height = height
Dim bi As BitmapImage = New BitmapImage(URI)
img.Source = bi
img.Tag = bi.UriSource.ToString
Return img
End Function
El proceso para insertar cualquier otro objeto UIElement en un control RichTextBox es igual que el proceso
que se ha descrito para insertar un control Image. En este ejemplo, se utiliza el mismo proceso para insertar
objetos DataGrid y Calendar.
El botn Insertar hipervnculo permite insertar hipervnculos en el editor. Para insertar un hipervnculo, se
utiliza el elemento Hyperlink. Se usa la propiedad NavigateUri para especificar el identificador. Cuando se
hace clic en el botn Insertar hipervnculo, aparece el cuadro de dilogo Insertar direccin URL, tal y
como se muestra en la siguiente ilustracin.
El cuadro de dilogo Insertar direccin URL es un control ChildWindow que permite escribir la Direccin
URL de destino y una Descripcin de la direccin URL del hipervnculo. En el siguiente cdigo, se muestra
cmo se implementa la insercin del hipervnculo.
//Insert a hyperlink
private void btnHyperlink_Click(object sender, RoutedEventArgs e)
{
InsertURL cw = new InsertURL(rtb.Selection.Text);
cw.HasCloseButton = false;
if (cw.txtURLDesc.Text.Length > 0)
hyperlink.Inlines.Add(cw.txtURLDesc.Text);
else
hyperlink.Inlines.Add(cw.txtURL.Text);
rtb.Selection.Insert(hyperlink);
ReturnFocus();
}
};
cw.Show();
}
Cuando se hace clic en el botn Aceptar o Cancelar del cuadro de dilogo Insertar direccin URL, se
valida el valor de Direccin URL de destino. Esta validacin se realiza en el controlador de eventos Closing.
La validacin se realiza en el evento Closing en lugar del evento Closed porque, de este modo, se mantiene
abierto el cuadro de dilogo si se produce un error de validacin. Si el identificador URI es vlido, se crea un
nuevo objeto Hyperlink y se inserta en la seleccin actual del control RichTextBox.
Imprimir
Es posible imprimir el contenido del editor mediante el botn Imprimir. La impresin es una nueva
caracterstica de Silverlight 4. Cuando se hace clic en el botn Imprimir, se muestra el cuadro de dilogo
Vista previa de impresin. Este cuadro de dilogo Vista previa de impresin es un objeto ChildWindow
que tiene una imagen del contenido que se va a imprimir. En la ilustracin siguiente, se muestra el cuadro
de dilogo Vista previa de impresin.
Esta imagen se crea con un objeto WriteableBitmap que toma el objeto RichTextBox como parmetro. A
continuacin se muestran el cdigo XAML para crear el cuadro de dilogo Vista previa de impresin y el
cdigo para crear la imagen WriteableBitmap.
<!-- NOTE:
By convention, the sdk prefix indicates a URI-based XAML namespace declaration
for Silverlight SDK client libraries. This namespace declaration is valid for
Silverlight 4 only. In Silverlight 3, you must use individual XAML namespace
declarations for each CLR assembly and namespace combination outside the scope
of the default Silverlight XAML namespace. For more information, see the help
topic "Prefixes and Mappings for Silverlight Libraries".
Cuando se hace clic en el botn Aceptar del cuadro de dilogo Vista previa de impresin, su contenido se
imprime mediante el objeto PrintDocument, tal y como se muestra en el siguiente cdigo.
//Print the document
private void btnPrint_Click(object sender, RoutedEventArgs e)
{
PrintPreview cw = new PrintPreview();
cw.ShowPreview(rtb);
cw.HasCloseButton = false;
//Hook up a handler to the Closed event before displaying the PrintPreview window by calling the Show() method.
cw.Closed += (t, a) =>
{
if (cw.DialogResult.Value)
{
PrintDocument theDoc = new PrintDocument();
theDoc.PrintPage += (s, args) =>
{
args.PageVisual = rtb;
args.HasMorePages = false;
};
theDoc.EndPrint += (s, args) =>
{
MessageBox.Show("The document printed successfully", "Text Editor", MessageBoxButton.OK);
};
theDoc.Print("Silverlight 4 Text Editor");
ReturnFocus();
}
};
cw.Show();
}
Display
El ejemplo del editor de texto de Silverlight admite el diseo de derecha a izquierda, que es una nueva
caracterstica de Silverlight 4. Se incluye por motivos de compatibilidad con idiomas como el rabe y el
hebreo. En la siguiente ilustracin, se muestra el ejemplo del editor de texto de Silverlight en el diseo de
derecha a izquierda.
El botn de alternancia Direccin del texto sirve para pasar del diseo de izquierda a derecha al diseo de
derecha a izquierda, y viceversa. En el siguiente cdigo, se muestra cmo se usa el objeto FlowDirection
para este propsito.
//Set the flow direction
public void btnRTL_Checked(object sender, RoutedEventArgs e)
{
//Set the button image based on the state of the toggle button.
if(btnRTL.IsChecked.Value)
btnRTL.Content = MainPage.createImageFromUri(new Uri("/RichNotepad;component/images/rtl.png",
UriKind.RelativeOrAbsolute), 30, 32);
else
btnRTL.Content = MainPage.createImageFromUri(new Uri("/RichNotepad;component/images/ltr.png",
UriKind.RelativeOrAbsolute), 30, 32);
ApplicationBorder.FlowDirection = (ApplicationBorder.FlowDirection == System.Windows.FlowDirection.LeftToRight) ?
System.Windows.FlowDirection.RightToLeft : System.Windows.FlowDirection.LeftToRight;
ReturnFocus();
}
El botn de alternancia Modo de edicin o vista para pasar del modo de edicin al estado de solo lectura
del editor, y viceversa. De forma predeterminada, el editor est en modo de edicin. En el siguiente cdigo,
se muestra cmo se implementa el modo de edicin o de solo lectura.
//Make the RichTextBox read-only
public void btnRO_Checked(object sender, RoutedEventArgs e)
{
rtb.IsReadOnly = !rtb.IsReadOnly;
//Set the button image based on the state of the toggle button.
if (rtb.IsReadOnly)
btnRO.Content = MainPage.createImageFromUri(new Uri("/RichNotepad;component/images/view.png",
UriKind.RelativeOrAbsolute), 29, 32);
else
btnRO.Content = MainPage.createImageFromUri(new Uri("/RichNotepad;component/images/edit.png",
UriKind.RelativeOrAbsolute), 29, 32);
ReturnFocus();
}
Para especificar el modo de solo lectura, se establece la propiedad IsReadOnly de RichTextBox en true. Los
elementos de la interfaz de usuario y los hipervnculos de un control RichTextBox estn activos nicamente
en modo de solo lectura. Por ejemplo, pueden responder a entradas y recibir el foco nicamente cuando
estn en modo de solo lectura.
Resaltar
Cuando se activa el botn de alternancia Resaltar, se resalta toda la lnea en la que se encuentra el puntero
del mouse. En la ilustracin siguiente, se muestra un ejemplo del resaltado.
Cuando se activa el botn de alternancia del resaltado, el controlador de eventos enumera el contenido del
control RichTextBox y crea un rectngulo que delimita cada lnea. Los rectngulos se agregan a una lista. En
los siguientes pasos, se muestra cmo se crea la lista de todos los rectngulos.
1. Obtenga un objeto TextPointer que apunte al comienzo del contenido del control RichTextBox
mediante la propiedad ContentStart.
2. Obtenga el rectngulo delimitador del primer carcter mediante el mtodo GetCharacterRect.
3. Obtenga el rectngulo delimitador de la primera lnea. Para ello, se enumera el contenido mediante
el mtodo GetNextInsertionPosition. Obtenga el objeto TextPointer en cada posicin. Compruebe si
ha pasado a la lnea siguiente; para ello, compare las coordenadas de los puntos Top de los
rectngulos que se han obtenido mediante el comienzo del objeto TextPointer de la lnea y el
objeto TextPointer actual. Si pasa a la lnea siguiente, cree el rectngulo de la lnea actual y
agrguelo a la lista antes de iniciar la misma enumeracin para la lnea siguiente.
4. Repita el paso anterior hasta que se procesen todas las lneas.
Ya tiene una lista de los rectngulos correspondientes a cada una de las lneas del contenido.
Para determinar qu lnea se va a resaltar, el cdigo realiza una prueba de posicionamiento para la posicin
actual del mouse con respecto a la lista de rectngulos en el controlador de eventos MouseMove del
control RichTextBox. El cdigo resalta una lnea mostrando un rectngulo en el control Canvas denominado
highlightCanvas.
XAML
El botn XAML sirve para mostrar el marcado XAML del contenido del editor. Para ello, se usa la propiedad
RichTextBox.Xaml. En el siguiente cdigo, se ilustra cmo mostrar el XAML mediante la propiedad Xaml.
'Set the xamlTb TextBox with the current XAML of the RichTextBox and make it visible. Any changes to the XAML made
'in xamlTb is also reflected back on the RichTextBox. Note that the Xaml string returned by RichTextBox.Xaml will
'not include any UIElement contained in the current RichTextBox. Hence the UIElements will be lost when you
'set the Xaml back again from the xamlTb to the RichTextBox.
Public Sub btnMarkUp_Checked(ByVal sender As Object, ByVal e As RoutedEventArgs)
If btnMarkUp.IsChecked.Value Then
xamlTb.Visibility = System.Windows.Visibility.Visible
xamlTb.IsTabStop = True
xamlTb.Text = rtb.Xaml
Else
rtb.Xaml = xamlTb.Text
xamlTb.Visibility = System.Windows.Visibility.Collapsed
xamlTb.IsTabStop = False
End If
End Sub
Cuando se hace clic en el botn XAML, el marcado XAML se muestra en un control TextBox denominado
xamlTb. El valor predeterminado de la propiedad Visibility de xamlTb es Collapsed y cambia a Visible
cuando se hace clic en el botn XAML. Si se realizan cambios en el marcado XAML de xamlTb, dichos
cambios se reflejan en el contenido del control RichTextBox. Observe que la cadena XAML devuelta por la
propiedad Xaml no incluye ningn objeto UIElement que se encuentre en el control RichTextBox. Por
consiguiente, se perdern los objetos UIElement cuando se pase de nuevo de la vista XAML al control
RichTextBox.
Archivo
Cuando se hace clic en el botn Nuevo archivo, se borra el contenido existente del control RichTextBox. En
el siguiente cdigo, se muestra el proceso para crear un nuevo archivo.
//Clears the contents of the existing file.
private void btnNew_Click(object sender, RoutedEventArgs e)
{
rtb.Blocks.Clear();
}
Es posible abrir un archivo existente mediante el botn Abrir archivo. En el siguiente cdigo, se muestra el
proceso de abrir un archivo existente.
//Opens an existing file
private void btnOpen_Click(object sender, RoutedEventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
Cuando se hace clic en el botn Abrir archivo, se crea un objeto OpenFileDialog que se muestra mediante
el mtodo ShowDialog. Se trata del cuadro de dilogo Abrir archivo estndar de Windows, que se puede
usar para seleccionar el archivo que se desea abrir. El archivo seleccionado se abre como StreamReader y su
contenido se asigna a la propiedad Xaml del control RichTextBox.
Es posible guardar el archivo existente mediante el botn Guardar archivo. Si el control RichTextBox
contiene objetos UIElement, estos no se guardan durante la operacin de guardar. No es posible guardar
los objetos UIElement porque la propiedad Xaml del control RichTextBox incluye nicamente contenido de
texto y el marcado asociado. En el siguiente cdigo, se muestra cmo se guarda el contenido actual.
//Saves the existing file
private void btnSave_Click(object sender, RoutedEventArgs e)
{
string ContentToSave = rtb.Xaml;
//Check if the file contains any UIElements
var res = from block in rtb.Blocks
from inline in (block as Paragraph).Inlines
where inline.GetType() == typeof(InlineUIContainer)
select inline;
//If the file contains any UIElements, it will not be saved
if (res.Count() != 0)
{
MessageBox.Show("Saving documents with UIElements is not supported");
return;
}
SaveFileDialog sfd = new SaveFileDialog();
sfd.DefaultExt = ".sav";
sfd.Filter = "Saved Files|*.sav|All Files|*.*";
if (sfd.ShowDialog().Value)
{
using (FileStream fs = (FileStream)sfd.OpenFile())
{
System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding();
byte[] buffer = enc.GetBytes(ContentToSave);
fs.Write(buffer, 0, buffer.Length);
fs.Close();
}
}
}
Primero, el cdigo enumera el contenido del control RichTextBox y comprueba si hay objetos UIElement. Si
el control RichTextBox contiene objetos UIElement, finaliza la operacin de guardar y se muestra un cuadro
de mensaje. Si el control RichTextBox solo tiene elementos de texto, se crea un control SaveFileDialog que
se muestra mediante el mtodo ShowDialog. Se trata del cuadro de dilogo Guardar archivo estndar de
Windows, que se puede usar para guardar un archivo. El contenido del control RichTextBox se recupera
como una cadena mediante la propiedad Xaml y, a continuacin, se escribe en un objeto FileStream.
Arrastrar y colocar
Es posible abrir archivos de texto y de Office Word en el ejemplo del editor de texto de Silverlight
arrastrndolos hasta el rea de contenido. Esta caracterstica se implementa mediante la nueva caracterstica
de arrastrar y colocar de Silverlight 4. En el cdigo siguiente, se muestra el mtodo de control del evento
Drop.
private void rtb_Drop(object sender, System.Windows.DragEventArgs e)
{
VisualStateManager.GoToState(this, "Normal", true);
//the Drop event passes in an array of FileInfo objects for the list of files that were selected and drag-dropped onto the
RichTextBox.
if (e.Data == null)
{
ReturnFocus();
return;
En el controlador de eventos Drop (rtb_Drop), la lista de objetos FileInfo de los archivos colocados en el
control RichTextBox se pasa en el argumento del evento. El controlador de eventos rtb_Drop enumera los
objetos FileInfo y analiza los archivos .txt y .docx. Se omiten los archivos con otras extensiones. Las
funciones ParseTxtFile y ParseDocxFile (que no se muestran en este tema) toman el objeto FileInfo, lo
analizan y agregan su contenido al control RichTextBox.
Requisitos previos
Para compilar el ejemplo Issue Tracker, se requieren los siguientes componentes:
Silverlight 4.
Silverlight 4 Tools para Visual Studio 2010.
Visual Studio 2010.
Kit de herramientas de Silverlight
Servicios RIA de WCF
Kit de herramientas de Servicios RIA de WCF
RichTextBox
Se utiliza para mostrar las tendencias de los Kit de herramientas de
Grficos
problemas en la pgina Informes. Silverlight
Se utiliza para personalizar la apariencia de la Kit de herramientas de
Temas
aplicacin. Silverlight
Se utiliza para validar los datos
Validacin de datos proporcionados por el usuario en los diversos INotifyDataErrorInfo
campos de un problema.
Se utiliza para asociar acciones a los botones
Comandos Guardar y Crear que se utilizan para guardar ICommand
y crear problemas o incidencias.
FileInfo
DragEventArgs
Se utiliza para vincular la aplicacin de
Documentacin de los
Servicios RIA de WCF Silverlight a la base de datos en la aplicacin
servicios RIA de WCF
ASP.NET.
Los temas que se utilizan para personalizar la
Kit de herramientas de
ContextMenu apariencia de la aplicacin se muestran en un
Silverlight
men contextual.
Imprimir
Se utiliza para imprimir los informes sobre las
Impresin
tendencias de los errores.
PrintDocument
Se utiliza para enlazar a datos la propiedad
DataBinding: compatibilidad con SelectedValue de algunos cuadros
SelectedValue
el selector combinados, como el cuadro combinado
Estado.
DataBinding: para especificar los Se utiliza para establecer el valor de
FallbackValue
valores de presentacin presentacin predeterminado de algunos
predeterminados de un control controles, como el cuadro combinado
TargetNullValue
enlazado a datos Abierto por.
DataBinding: para agrupar los Se utiliza para agrupar las plataformas de un
GroupDescriptions
elementos de una coleccin problema por tipo de procesador.
Se utiliza para mostrar el texto con formato en
DataBinding: formato de cadena el bloque de texto donde se muestra el StringFormat
identificador del problema.
Para personalizar la apariencia del ejemplo Issue Tracker, se puede usar el men contextual que aparece
cuando se hace clic con el botn secundario del mouse en cualquier punto del ejemplo. Este
comportamiento se implementa mediante los controles Themes y ContextMenu, que estn disponibles en el
Kit de herramientas de Silverlight.
El ejemplo tambin tiene un indicador de ocupacin que aparece cuando el cliente IssueTracker est
comunicando con el servicio IssueTracker.Web. Este comportamiento se implementa mediante el control
BusyIndicator, que tambin est incluido en el Kit de herramientas de Silverlight.
Aplicacin IssueTracker.Web ASP.NET
IssueTracker.Web es una aplicacin ASP.NET que hospeda una base de datos denominada
IssueTrackerData.mdf y la lgica de nivel medio que administra la interaccin entre la aplicacin cliente
IssueTracker y la base de datos.
En la siguiente tabla, se muestran las diversas tablas que se incluyen en esta base de datos.
Para crear un vnculo de servicios RIA entre el servidor y el cliente de Silverlight, se necesita un modelo de
entidad que represente las tablas y las columnas presentes en la base de datos. Un modelo de entidad
representa las tablas y las columnas como tipos de CLR (las tablas se representan como clases; las columnas
y las asociaciones de clave externa se representan como propiedades). En este proyecto, se usa el modelo
de entidad LINQ to SQL, representado por el archivo IssueTrackerData.Dbml.
Una vez elegido el modelo de entidad, se puede crear un vnculo de servicios RIA agregando una clase
LinqToSqlDomainService(Of TContext) al servidor. Para ello, se utiliza el cuadro de dilogoque permite
agregar una nueva clase de servicio de dominio. En este cuadro de dilogo, se pueden seleccionar los tipos
(que representan las tablas) del modelo de entidad que se van a incluir en el servicio de dominio. Hay que
activar la casilla que permitehabilitar la edicin para que pueda haber un enlace de datos bidireccional entre
el cliente y el servidor. La clase de servicio de dominio para este proyecto es la clase
IssueTrackerDomainService. Al crear el servicio de dominio, se generan automticamente los mtodos para
consultar, actualizar y eliminar filas en todas las tablas asociadas. Adems, hace que los mismos mtodos
estn disponibles en el proyecto de cliente de Silverlight como la clase IssueTrackerDomainContext. Se
modifican estos mtodos para personalizar el resultado de las consultas.
La pgina My Issues (Mis problemas) es similar a la pgina All Issues (Todos los problemas), salvo la
consulta GetMyIssues que se utiliza para rellenar DataGrid. La consulta GetMyIssues filtra los problemas
asignados al usuario actual.
Al seleccionar un problema en el control DataGrid, el control IssueEditor se rellena con los detalles del
problema seleccionado. El problema seleccionado se pasa como DataContext al control IssueEditor, tal y
como se muestra en el siguiente XAML.
<my:IssueEditor Grid.Row="2" DataContext="{Binding Data.CurrentItem, ElementName=issueDomainDataSource}"
x:Name="issueEditor1" />
IssueEditor es un control de usuario que se utiliza para ver y actualizar los detalles de un problema. El
control IssueEditor se utiliza para ver y actualizar los problemas en la pgina All Issues (Todos los
problemas), ver y actualizar los problemas asignados al usuario en la pgina My Issues (Mis problemas), y
crear un nuevo problema en la pgina New Issue (Nuevo problema). El control IssueEditor se compone de
un gran nmero de controles de Silverlight que estn enlazados a varias columnas y las muestran en la tabla
Issues. En las siguientes secciones, se describe cmo se implementan las reas de ttulo del problema,
estado, usuario al que se asigna el problema y plataforma del control IssueEditor.
Ttulo del problema
El ttulo del problema se muestra en un control TextBox que est enlazado a la columna Title
correspondiente al problema seleccionado en la tabla Issues, tal y como se muestra en el siguiente XAML.
<TextBox Name="textBox4" Grid.Column="1" Text="{Binding Path=Title, Mode=TwoWay, NotifyOnValidationError=True}"
VerticalAlignment="Center" />
Status
El estado del problema se muestra en un control ComboBox. Los elementos del control ComboBox estn
enlazados a la tabla Status y la propiedad SelectedValue del control ComboBox est enlazada al estado del
problema seleccionado. En el siguiente XAML, se muestra cmo se implementa.
<ComboBox DisplayMemberPath="Name" ItemsSource="{Binding Status, Source={StaticResource issueTrackerData}}"
Name="comboBox7" SelectedValue="{Binding StatusID, Mode=TwoWay}" SelectedValuePath="StatusID" ...
Plataforma
La informacin de plataforma contiene opciones de sistema operativo, explorador e idioma que se pueden
asociar a un problema. La informacin de plataforma se muestra en un control DataGrid que est enlazado
a la tabla Platforms de la base de datos, tal y como se muestra en el siguiente XAML.
<sdk:DataGrid Name="dataGrid3" IsReadOnly="True" ItemsSource="{Binding Source={StaticResource platformViewSource}}"
SelectedItem="{Binding Platform, Mode=TwoWay}" ...
<sdk:DataGrid.Columns>
<sdk:DataGridTemplateColumn Header="Operating System" Width="*" SortMemberPath="OSVersion">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Text="{Binding OS}" />
<TextBlock Text=" " />
<TextBlock Text="{Binding OSVersion}" />
</StackPanel>
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
La propiedad Command est enlazada al comando AddIssue, que es del tipo ICommand. La clase AddIssue
implementa la interfaz ICommand, tal y como se muestra en el siguiente cdigo.
private class AddIssueCommand : ICommand
{
...
#region ICommand Members
public bool CanExecute(object parameter)
{
return parameter != null && parameter is Issue && !dc.IsLoading && !dc.IsSubmitting;
}
public event EventHandler CanExecuteChanged;
public void Execute(object parameter)
{
...
dc.Issues.Add(parameter as Issue);
(parameter as IEditableObject).EndEdit();
dc.SubmitChanges();
}
#endregion
}
Se usa el mtodo CanExecute para comprobar si el comando AddIssue puede ejecutarse en este momento.
Mediante este mtodo, se comprueba si hay alguna operacin de carga o de envo en curso en el vnculo de
servicios RIA. El mtodo Execute llama al mtodo EndEdit del nuevo problema, agrega el problema a la tabla
Issues y enva los cambios pendientes al vnculo de los servicios RIA.
Para realizar cambios y actualizar un problema existente, haga clic en el botn Save (Guardar) que figura en
las pginas All Issues (Todos los problemas) y My Issues (Mis problemas). El botn Save est asociado a
una propiedad Command denominada SaveChanges, tal y como se muestra en el siguiente XAML.
<Button Content="Save" Command="{Binding SaveChanges, Source={StaticResource issueTrackerData}}"
CommandParameter="{Binding Data.CurrentItem, ElementName=issueDomainDataSource}" ...
La clase SaveChanges implementa la interfaz ICommand, tal y como se muestra en el siguiente cdigo.
Se invoca el mtodo CanExecute para comprobar si el comando SaveChanges puede ejecutarse en este
momento. Con este mtodo, se comprueba si hay que guardar algn cambio y si hay alguna operacin de
carga o de envo en curso en el vnculo de servicios RIA. El mtodo Execute invoca el mtodo EndEdit del
problema actual y enva los cambios pendientes al vnculo de servicios RIA.
Si la consulta anterior devuelve problemas, se genera una cadena de error, se agrega dicha cadena a una
lista de errores y se provoca el evento ErrorsChanged. Esto queda reflejado en el ejemplo de cdigo
siguiente.
partial void OnTitleChanged()
{
...
var data = new IssueTrackerDomainContext();
Para que el control TextBox correspondiente al ttulo controle este evento ErrorsChanged, se debe
establecer la propiedad NotifyOnValidationError en true, tal y como se muestra en el siguiente XAML.
<TextBox Text="{Binding Path=Title, Mode=TwoWay, NotifyOnValidationError=True}" ...
El mtodo GetErrors devuelve una lista IEnumerable con los mensajes de error que existen para un campo
determinado. La propiedad HasErrors indica si hay algn error asociado a la clase Issue. En el ejemplo de
cdigo siguiente, se muestra cmo la clase Issue implementa el mtodo GetErrors y la propiedad HasErrors.
public System.Collections.IEnumerable GetErrors(string propertyName)
{
if (errors != null && errors.ContainsKey(propertyName))
return errors[propertyName];
return null;
}
public bool HasErrors
get
{
return (from errorList in errors.Values where (from e in errorList where !(e is string && ((string)e).StartsWith("Warning: "))
select e).Count() > 0 select errorList).Count() > 0;
}
}
Estos modelos de programacin son distintos porque no se pueden utilizar al mismo tiempo dentro de una
instancia nica del complemento Silverlight. Sin embargo, puede implementar una pantalla de presentacin
que utilice la API de JavaScript y, a continuacin, pasar a la API administrada cuando la aplicacin se ha
cargado.
La API administrada proporciona significativamente ms funcionalidad que la API de JavaScript y es el tema
tratado en la mayor parte de la documentacin de Silverlight. Las aplicaciones que utilizan la API
administrada tienen acceso a una versin ligera de .NET Framework. La API de JavaScript, sin embargo, solo
tiene acceso al ncleo de presentacin de Silverlight y al motor del explorador de JavaScript.
La API administrada
Puede utilizar el marcado XAML para encapsular los diseos de interfaz de usuario en la API administrada y
la API de JavaScript. Con la API administrada, sin embargo, puede factorizar el cdigo de la aplicacin en
varios archivos XAML y archivos de cdigo subyacente.
Cuando el complemento Silverlight carga los archivos XAML, crea un rbol de objetos que el cdigo
subyacente puede manipular. El cdigo de la aplicacin administrada tambin puede manipular el Modelo
de objetos de documento HTML (DOM) a travs del puente HTML.
La API de JavaScript
La API de JavaScript es el modelo que estuvo disponible en Silverlight versin 1.0 y se mantiene para la
compatibilidad con versiones anteriores y para habilitar escenarios determinados.
En la API de JavaScript, el complemento Silverlight carga una pgina XAML nica, en lugar de un paquete de
aplicacin. Este XAML puede incluir referencias URI a recursos del servidor, como imgenes y vdeos. El
complemento Silverlight usa el XAML para crear un rbol de objetos que puede manipular mediante
programacin utilizando JavaScript en la pgina HTML en que se hospeda.
La API de JavaScript no proporciona ningn modelo de aplicaciones capaz de admitir aplicaciones
complejas con navegacin interna. Sin embargo, habilita escenarios para los que la API administrada es
demasiado prolija, como las pantallas de presentacin. Tambin puede implementar la navegacin bsica
cargando nuevas pginas de XAML en el complemento Silverlight o cargando las nuevas pginas web en el
explorador.
Estructura de aplicacin
El sistema de activacin de Silverlight permite especificar los ensamblados y archivos de recursos que se
deben incluir con la aplicacin. El sistema de compilacin incluye los archivos especificados en un paquete
de aplicacin, que es un archivo zip comprimido con la extensin .xap.
Puede reducir el tamao del paquete de la aplicacin mediante el almacenamiento en cach de biblioteca
de aplicaciones. En este caso, los ensamblados configurados para el almacenamiento en cach se
comprimen en archivos zip independientes. Estos ensamblados se denominan ensamblados ExternalPart.
Este paquete incluye un archivo de manifiesto que identifica todos los ensamblados que la aplicacin puede
utilizar. Se incluyen:
Los ensamblados del paquete de la aplicacin.
Los ensamblados ExternalPart, que se descargan en el inicio y posteriormente se almacenan en
cach.
Los ensamblados que se podran descargar despus del inicio.
Como mnimo, el paquete de la aplicacin debe incluir tambin el ensamblado con la clase de aplicacin, de
la que el complemento Silverlight crea instancias. Cuando la aplicacin se inicia, puede realizar tareas como
mostrar una interfaz de usuario o recuperar recursos adicionales.
El usuario debe decidir qu ensamblados y archivos de recursos va a implementar en el paquete de la
aplicacin, como ensamblados ExternalPart, o cules se van a recuperar despus del inicio. Uno de los flujos
de trabajo ms comunes es incluir todo en el paquete de aplicacin y, a continuacin, medir los tiempos de
descarga e inicio cuando aumenta el tamao de la aplicacin. Cuando el retraso se incrementa de manera
significativa, se debe considerar la posibilidad de proporcionar una pantalla de presentacin, mediante el
almacenamiento en cach de biblioteca de aplicaciones, y recuperar algunos archivos despus del inicio.
Servicios de aplicacin
La clase Application proporciona servicios en las categoras siguientes:
Eventos Startup y Exit de la aplicacin.
Interaccin con el complemento Silverlight y la pgina web del host.
Administracin de recursos.
Control de excepciones centralizado.
Todas las aplicaciones basadas en Silverlight deben incluir una clase nica derivada de Application.
Normalmente, la clase de aplicacin agregar los recursos de aplicacin basados en XAML y controlar el
evento Startup para proporcionar una interfaz de usuario. El complemento Silverlight muestra la interfaz de
usuario en su rea de cliente tal y como se configura en la pgina web del host.
Se puede utilizar el evento Startup para inicializar la aplicacin y su interfaz de usuario. Por ejemplo, se
puede especificar el estado inicial de la aplicacin basndose en los parmetros de configuracin del
complemento Silverlight, los parmetros de direccin URL o los valores de usuario recuperados del
almacenamiento aislado.
Tambin se puede utilizar el evento Startup para iniciar la descarga asincrnica de ensamblados y archivos
de recursos adicionales. La clase Application proporciona un mtodo auxiliar para extraer los recursos del
paquete de ensamblados o los archivos zip descargados.
Recursos
Silverlight admite los siguientes tipos de recursos:
Recursos XAML, como estilos y plantillas que varios elementos de la interfaz de usuario pueden
compartir.
Archivos de recursos, como imgenes y vdeos a los que se puede hacer referencia mediante un
identificador URI. Los archivos de recursos se pueden incrustar en los ensamblados, incluir por
separado en el paquete de aplicacin o recuperar de la red.
Cadenas de recursos y otros valores incrustados en los ensamblados o proporcionados a travs de
ensamblados satlite localizados.
En general, el trmino archivo de recursos puede hacer referencia a cualquier archivo que complemente el
ensamblado de la aplicacin. Pueden ser archivos de datos o ensamblados de biblioteca que contienen
otros tipos de recursos, como cadenas localizadas o archivos XAML.
A algunos archivos de recursos, como las imgenes, se puede hacer referencia mediante un identificador
URI. Este identificador URI puede ser absoluto para recuperar archivos de cualquier ubicacin de Internet o
puede ser relativo. Silverlight utiliza un mecanismo de reserva para los identificadores URI relativos de modo
que se puede cambiar la ubicacin de implementacin de algunos archivos sin tener que cambiar el cdigo.
Algunos tipos de archivo, como archivos zip y ensamblados, se pueden recuperar nicamente desde el sitio
de origen mediante una operacin de descarga asincrnica. Se puede utilizar la clase Application para
extraer los recursos de los archivos zip y la clase AssemblyPart para cargar los ensamblados.
Navegacin
Silverlight proporciona varias opciones para navegar dentro de la aplicacin o a recursos ajenos a la
aplicacin.
Para la navegacin dentro de la aplicacin, se usan los controles Page y Frame. El marco acta como
contenedor de controles de pgina, y facilita la navegacin a las pginas. Cada pgina incluye contenido, y
se pueden agregar cuantas pginas sean necesarias para representar el contenido para el usuario. En
cualquier momento, el marco muestra el contenido de una sola pgina. Para la navegacin a recursos
externos, se pueden proporcionar hipervnculos normales en la interfaz de usuario o se puede incluir la
navegacin mediante programacin a travs del DOM HTML.
Pantallas de presentacin
Silverlight proporciona compatibilidad con las pantallas de presentacin de modo que se puede
personalizar la experiencia predeterminada durante la descarga y el inicio de las aplicaciones administradas.
La pantalla de presentacin predeterminada muestra una simple animacin giratoria despus de un
pequeo retraso.
Si el paquete de aplicacin requiere un tiempo de descarga e inicio significativo, quizs desee reemplazar la
pantalla de presentacin predeterminada con otra en la que se muestra el progreso de la descarga. La
pantalla de presentacin tambin se puede utilizar para describir la aplicacin o proporcionar instrucciones,
crditos o avisos de exencin de responsabilidad.
Las pantallas de presentacin de Silverlight se implementan mediante la API de JavaScript. De este modo, el
complemento Silverlight puede mostrar inmediatamente la pantalla de presentacin, incluso antes de que
se cargue el motor en tiempo de ejecucin administrado de Silverlight. La pantalla de presentacin se
puede cambiar mediante programacin utilizando en la pgina web del host cdigo JavaScript interpretado
por el explorador.
aplicacin para identificar la clase de aplicacin de la que se va a crear una instancia. Esta clase se conoce
como el punto de entrada de la aplicacin y debe derivarse de la clase Application.
Si se usa el almacenamiento en cach de biblioteca de aplicaciones, el manifiesto tambin indica qu
ensamblados necesarios son externos al paquete de la aplicacin. El complemento recuperar todos esos
archivos. En el caso de las aplicaciones adaptadas, el complemento recuperar tambin los ensamblados
satlite especficos de la referencia cultural para todos los ensamblados internos y externos necesarios. La
clase Application proporciona un evento Startup que se puede controlar para inicializar la aplicacin y su
interfaz de usuario. La clase Application tambin proporciona otros servicios de aplicacin que normalmente
son necesarios. Por ejemplo, se puede utilizar esta clase para extraer los archivos de recursos del paquete de
aplicacin o de archivos zip descargados.
El proceso a travs del cual se descargan los archivos de inicio de la aplicacin y se crea una instancia de la
clase de aplicacin se conoce como sistema de activacin de Silverlight. El sistema de activacin permite
especificar una descarga inicial mnima de uno o ms paquetes para optimizar el almacenamiento en cach.
Despus de la activacin, la aplicacin puede recuperar a peticin otros ensamblados de biblioteca y
archivos de recursos adicionales.
En este tema se describe la estructura del paquete de aplicacin. Tambin explica las opciones para
implementar los archivos en el paquete de aplicacin, como elementos necesarios pero externos, o como
archivos a peticin.
Paquete de aplicacin
Un paquete de aplicacin contiene los archivos siguientes:
Un archivo AppManifest.xaml, que identifica los ensamblados empaquetados y el punto de entrada
de la aplicacin.
Un ensamblado de aplicacin, que incluye la clase de aplicacin.
Cero o ms ensamblados de biblioteca.
Cero o ms archivos de recursos separados, como imgenes o archivos de vdeo.
El archivo AppManifest.xaml lo suele generar el proceso de compilacin y utiliza marcado XAML para
declarar un objeto Deployment para la aplicacin.
En el archivo AppManifest.xaml, el elemento Deployment incluye los atributos siguientes:
Un atributo RuntimeVersion para identificar la versin requerida de Silverlight.
Los atributos EntryPointAssembly y EntryPointType para identificar el punto de entrada de la
aplicacin.
El elemento Deployment tambin incluye un elemento secundario de la propiedad Deployment.Parts que
tiene un elemento AssemblyPart secundario para cada ensamblado incluido en el paquete de aplicacin.
Si se usa el almacenamiento en cach de biblioteca de aplicaciones, el elemento Deployment tambin
podra incluir un elemento de propiedad Deployment.ExternalParts secundario. Este elemento est presente
si se han agregado referencias a ensamblados de biblioteca configurados para el uso con el
almacenamiento en cach de biblioteca de aplicaciones. El elemento de propiedad
Deployment.ExternalParts tiene un elemento ExtensionPart secundario para cada paquete de biblioteca
externo.
El paquete de aplicacin debe incluir un archivo AppManifest.xaml y un ensamblado de aplicacin de punto
de entrada. Todos los dems componentes de la aplicacin se pueden implementar como archivos
empaquetados, archivos ExternalPart o archivos a peticin.
Los archivos empaquetados son archivos que se incluyen en el paquete de aplicacin. Normalmente, se
incluyen los archivos principales que la aplicacin requiere al iniciarse o que deben estar disponibles de
inmediato para evitar retrasos despus del inicio. Tambin se pueden incluir los recursos compartidos, como
imgenes, que se pueden incrustar en ensamblados o proporcionar como archivos independientes en el
paquete de aplicacin.
Los archivos ExternalPart son archivos zip que contienen uno o ms ensamblados necesarios en el inicio de
la aplicacin. Normalmente son ensamblados de biblioteca que tienen menos probabilidades de cambiar
que los archivos principales de la aplicacin. Es posible mejorar la eficacia del almacenamiento en cach en
los equipos de los usuarios si estos archivos se factorizan en descargas independientes.
Los archivos a peticin son los archivos que se implementan en un servidor, normalmente en la misma
ubicacin que el paquete de aplicacin. La aplicacin puede recuperar estos archivos despus de la
activacin. Segn el tipo y el tamao de los archivos, hay varias opciones para recuperar los archivos a
peticin. Por ejemplo, se pueden utilizar referencias de URI directas para recuperar archivos de imagen, o
bien, se pueden iniciar descargas asincrnicas para recuperar ensamblados de biblioteca o archivos zip. Para
obtener ms informacin, consulte la seccin siguiente.
En el diagrama siguiente se resumen la estructura del paquete de aplicacin y las opciones de
implementacin de los archivos de aplicacin.
que se puede mover cualquier archivo al que se haga referencia mediante un identificador URI relativo sin
tener que cambiar el cdigo.
Muchos tipos de archivo no admiten el uso de un identificador URI para hacer referencia a ellos y requieren
un procesamiento especial si se opta por volver a implementarlos como archivos a peticin. Por ejemplo, si
se vuelve a implementar un ensamblado de biblioteca, se debe agregar cdigo que lo recupere a peticin y
lo cargue en el dominio de aplicacin. En este caso, aunque todava se debe hacer referencia al ensamblado
en el proyecto de aplicacin, el valor Copia local se establece en Falso. De esta forma, se evita que en la
compilacin se agregue el ensamblado al paquete de aplicacin o que se solicite en el inicio como un
ensamblado ExternalPart.
Tambin se puede optar por sacar del paquete de aplicacin varios archivos de recursos relacionados para
recuperarlos a peticin como una sola descarga. Para ello, es preciso agruparlos en un archivo zip, que se
implementa en el servidor. A continuacin, se debe agregar cdigo que recupere el archivo zip a peticin y
extraiga su contenido.
Nota:
No se puede usar el almacenamiento en cach de biblioteca de aplicaciones y la compatibilidad
con la ejecucin fuera del explorador en la misma aplicacin. Las aplicaciones de ejecucin fuera
del explorador requieren que todos los ensamblados de inicio residan en el paquete de la
aplicacin.
Los elementos name, publickeytoken y version deben coincidir con los metadatos correspondientes
del ensamblado. El elemento relpath indica el nombre de archivo del ensamblado. Por ltimo, el
elemento extension indica el nombre del elemento externo empaquetado a travs del atributo
downloadUri.
El valor de atributo downloadUri se usa para rellenar la propiedad ExtensionPart.Source del
manifiesto de aplicacin, como se muestra en el fragmento de manifiesto siguiente.
<Deployment.ExternalParts>
<ExtensionPart Source="System.Json.zip" />
</Deployment.ExternalParts>
En el cdigo de ejemplo siguiente se muestra cmo recuperar un ensamblado del servidor del host a
peticin y, a continuacin, cargarlo en el dominio de aplicacin.
En este ejemplo se utiliza la clase WebClient para iniciar una descarga asincrnica del ensamblado en
respuesta a un clic del mouse del usuario. Cuando se completa la descarga, se utiliza la clase AssemblyPart
para cargar el ensamblado.
En este ejemplo se supone que se agreg una referencia al ensamblado en el proyecto de aplicacin. El
ensamblado debe tener tambin en Copia local el valor False para que no se implemente en el paquete de
la aplicacin.
Puede emplear esta tcnica para cargar ensamblados a los que no se hace referencia en su proyecto de
aplicacin. En este caso, sin embargo, debe usar la reflexin para crear instancias de los tipos a partir del
ensamblado cargado.
Ejemplo
En el ejemplo siguiente se carga un ensamblado denominado SilverlightLibrary.dll cuando el usuario hace
clic en un bloque de texto. En este ejemplo se usa un URI relativo para cargar el ensamblado desde la
misma ubicacin que el archivo XAP de la aplicacin.
<UserControl x:Class="SilverlightApplication.HomePage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid Background="SandyBrown">
<StackPanel x:Name="stackPanel">
<TextBlock>Page from Host Application</TextBlock>
<TextBlock
MouseLeftButtonUp="TextBlock_MouseLeftButtonUp"
Cursor="Hand">
Click Here to Display a UI from the Library Assembly
</TextBlock>
</StackPanel>
</Grid>
</UserControl>
Imports SilverlightLibrary
La API de Silverlight define su conjunto de objetos como rboles de objetos que permiten rellenar el
contenido inicial de una aplicacin basada en Silverlight mediante la carga de XAML y el ajuste del rbol de
objetos en tiempo de ejecucin. En la API administrada, la interaccin con el rbol de objetos de Silverlight
se define con cdigo administrado. Mediante el CLR, el cdigo administrado se compila para convertirlo en
un ensamblado. El ensamblado suele contener, adems, el marcado XAML para la aplicacin basada en
Silverlight. El cdigo administrado puede admitir el modelo de aplicaciones de Silverlight, y se le puede
llamar en respuesta a eventos de duracin de objetos o de eventos iniciados por el usuario. Tambin puede
utilizar el cdigo administrado para escribir clases de soporte, para definir objetos de datos y para muchos
otros escenarios de aplicacin. Tambin puede utilizar DLR en lugar del CLR, lo que se explica en Lenguajes
dinmicos en Silverlight.
explorador y, potencialmente, podra existir en el mismo mbito. En la API administrada, existe una
separacin ms formal, el cdigo administrado lo utilizan las bibliotecas bsicas de Silverlight y su CLR, no el
explorador. Para interactuar con el DOM de la API administrada, puede utilizar una serie de caractersticas
que se denominan en ocasiones colectivamente Puente HTML, o puente del DOM HTML. Algunas de estas
formas son:
Interfaces API que exponen al cdigo administrado las partes utilizadas con frecuencia del DOM
(por ejemplo, el objeto Document).
Medios que pueden hacer que los tipos administrados admitan script desde el DOM.
Tcnicas de conversin para la generacin de tipos administrados desde objetos o valores de
JavaScript cuyas referencias se calculan.
Interfaces API que especficamente expongan la representacin de objetos del complemento
Silverlight en el DOM.
Requisitos previos
En este tema se supone que el usuario ha ledo Informacin general sobre XAML y Arquitectura de
Silverlight.
Arboles de objetos
Un rbol de objetos es una conceptualizacin del modo en que se relacionan entre s los objetos que se
crean y existen en el contenido de Silverlight en tiempo de ejecucin. Las relaciones se basan en el principio
de que los objetos tienen propiedades y, muchas veces, el valor de la propiedad es otro objeto que a su vez
tambin tiene propiedades. El rbol de objetos tiene bifurcaciones porque algunas de estas propiedades
son propiedades de coleccin y contienen ms de un objeto; tambin tiene una raz porque la arquitectura
debe hacer referencia en ltima instancia a un nico objeto que es el punto de conexin de los conceptos
que se encuentran fuera del rbol de objetos (como el host del explorador o el complemento Silverlight que
muestra el contenido).
Aunque realmente hay un nico rbol de objetos desde el punto de vista conceptual, la API de Silverlight no
expone al usuario el rbol completo. Gran parte de la estructura del rbol de objetos son realmente detalles
de implementacin. En lugar de ello, el usuario dispone de propiedades especficas de objetos que influyen
en los valores secundarios de puntos determinados del rbol y que pueden informar acerca del elemento
primario (en la mayora de los casos, el eje primario es de solo lectura porque los rboles suelen generarse
de la raz hacia arriba, ya sea en cdigo o a travs del proceso de anlisis de XAML). Por ejemplo, un Panel
tiene una propiedad Children que establece los objetos secundarios. FrameworkElement tiene Parent para
notificar el elemento primario. Estas dos API se encuentran en clases base, de modo que estn disponibles
en un gran nmero de objetos de Silverlight.
En Silverlight, un concepto de rbol relacionado es el rbol visual. El rbol visual puede conceptualizarse
como una representacin editada o filtrada del rbol de objetos ms grande. El filtro que se aplica es que
solo los objetos que tienen una implicacin de representacin estn presentes en el rbol visual. Por
ejemplo, una clase de una coleccin no formara parte del rbol visual sino que, en lugar de ello, el rbol
visual abstrae las colecciones en un concepto de "elementos secundarios". Sin embargo, el rbol visual
tambin puede incluir objetos que no son inmediatamente visibles si se considera que el marcado XAML de
origen cargado es una aproximacin del rbol de objetos. Esto se debe a que el rbol visual tambin
notifica objetos que son partes compuestas de controles que proceden de una plantilla de control aplicada
o de diccionarios de recursos. El rbol visual se usa internamente para el proceso de representacin de
Silverlight, pero tener conocimientos sobre el rbol visual suele ser importante en determinados escenarios,
como a la hora de escribir o reemplazar una plantilla de control o en el anlisis de una instancia del control
en tiempo de ejecucin, una vez aplicada la plantilla. Para estos escenarios, Silverlight proporciona la API
VisualTreeHelper, que permite examinar el rbol visual de un modo ms generalizado de lo que podra
hacerse con las propiedades del elemento primario y de los elementos secundarios especficos del objeto.
El concepto de rbol visual tambin existe en WPF y, en Silverlight, el concepto de rbol visual es similar.
Una diferencia notable, sin embargo, es que WPF tambin proporciona una concepcin o filtro adicional del
rbol de objetos, que recibe el nombre de rbol lgico. El concepto de rbol lgico es relevante para
determinados comportamientos del sistema de propiedades. Silverlight no expone este rbol lgico a travs
de una clase auxiliar. En Silverlight, existen algunos de los comportamientos relevantes de las propiedades
(aunque no todos), pero sin una API auxiliar para obtener acceso a ellos, el concepto de rbol lgico no
resulta til en Silverlight y, por lo tanto, no se describe en la documentacin. Una implicacin de
compatibilidad secundaria derivada de la omisin del rbol lgico es que el comportamiento de la
propiedad FrameworkElement.Parent es diferente en Silverlight versin 4 y, realmente, esta notificando el
rbol visual primario.
plantilla suelen usar un TemplateBinding, que permite aplicar la plantilla y establecer valores concretos que
se incluyen en el objeto de plantilla.
Precaucin:
En general, Silverlight admite el concepto de cambio de aspecto visual o, de otro modo, redefinicin del
estilo o de la plantilla de un control. Concretamente, si es autor de un control y est escribiendo el cdigo
de soporte del control, puede ser peligroso suponer una estructura de rbol determinada. Puesto que la
mayora de los controles admiten una plantilla que puede establecerse (independientemente de que haya
habilitado puntos de extensin ms concretos, como estilos de subpartes), el rbol visual en tiempo de
ejecucin podra ser diferente de lo que sera si lo crease con la plantilla predeterminada aplicada.
Usar VisualTreeHelper
VisualTreeHelper es una clase de utilidad que puede resultar til para recorrer el rbol de objetos. El
concepto de rbol visual se explic anteriormente en la seccin "rboles de objetos" de este tema.
Dado que puede actuar sobre el rbol visual en tiempo de ejecucin y recorrer las partes de plantilla, esta
puede ser una tcnica til para examinar la composicin de la plantilla. Si lo desea, puede examinar una
coleccin de elementos secundarios que podra rellenarse mediante un enlace de datos o donde el cdigo
de la aplicacin no conozca totalmente la naturaleza global del rbol de objetos en tiempo de ejecucin .
Para hacer esto, tendra que recorrer el rbol a travs de GetChild, utilizando GetChildrenCount como
determinante de si el nodo de rbol es un elemento nico o una coleccin de "elementos secundarios" que
debe recorrer en iteracin por recuento.
API de JavaScript
Para obtener ms informacin sobre los rboles de objetos utilizando la API de JavaScript, vea API de
JavaScript para Silverlight.
Requisitos generales
Si se compila por marcado una pgina XAML de una aplicacin administrada (accin de
compilacin Pgina, con MSBuild:MarkupCompilePass1 como valor de Herramienta
personalizada), el elemento raz de la pgina debe declarar un atributo x:Class. Como reserva,
puede haber nicamente el archivo de cdigo subyacente (un archivo DependentUpon con la
accin de compilacin Compilar); vea la nota en la siguiente seccin.
Nota:
Si bien no se recomienda, se puede dejar en blanco la derivacin en la definicin de clase parcial
del cdigo subyacente si el marcado declar x:Class. Esto se puede hacer nicamente si la pgina
no tiene controladores de eventos ni ninguna otra lgica basada en cdigo. El resultado compilado
supondr que la raz de la pgina es la clase base de la clase parcial aunque no se especifique
(porque la parte correspondiente al marcado de la clase parcial s especifica implcitamente la clase
base a travs de su etiqueta de elemento raz).
La clase parcial debe ser pblica. Este requisito se debe a que la clase parcial definida a travs del
marcado x:Class es pblica cuando se compila por marcado, por lo que la clase parcial del cdigo
debe usar el mismo acceso para que se una a la clase parcial del marcado.
Se puede optar por omitir un espacio de nombres, siempre y cuando esto se corresponda con la
forma en que se declar x:Class.
Los controladores de eventos que se escriban deben ser mtodos de instancia definidos por la
clase parcial dentro del espacio de nombres identificado por x:Class. No se puede calificar el
nombre de un controlador de eventos para indicar a un procesador XAML que lo busque en otro
mbito de clase. Tampoco se puede utilizar un mtodo esttico como controlador de eventos.
Los controladores de eventos no necesitan ser pblicos; pueden ser privados o internos.
Generalmente, se recomienda escribir controladores de eventos no pblicos.
El controlador de eventos debe coincidir con el delegado del evento apropiado. Observe que
algunos eventos utilizan controladores genricos con datos de evento restringidos. En estos casos,
utilice la restriccin de los datos de evento que se indique en la firma de evento.
Los controladores de eventos se pueden compartir para el mismo evento en diferentes objetos. Si
el delegado lo permite, tambin se puede compartir el mismo controlador para diferentes tipos de
evento. Sin embargo, en este caso, la lgica del controlador de eventos debe utilizar los valores de
sender y/o de OriginalSource para distinguir los orgenes de los eventos.
En el caso concreto del lenguaje Visual Basic, se puede utilizar la palabra clave Handles especfica
del lenguaje para asociar los controladores a instancias y eventos en la declaracin del controlador,
en lugar de adjuntarlos a los atributos en XAML. Sin embargo, esta tcnica tiene algunas
limitaciones porque Handles no admite todas las caractersticas especficas del sistema de eventos,
como algunos escenarios de eventos enrutados.
DOM Descripcin
Gecko DOM (Mozilla, Firefox, versin 6 y Gecko es el componente de software que controla el anlisis de
posteriores de Netscape y otros HTML, el diseo de pginas, el modelo de objetos de documento y
exploradores basados en Mozilla) la representacin de la aplicacin completa.
El DOM de HTML dinmico (DHTML) ofrece a los autores acceso
directo y programable a los componentes individuales de sus
DHTML DOM (Internet Explorer)
documentos web, desde elementos individuales hasta
contenedores.
Despus de crear el complemento Silverlight (normalmente con una etiqueta HTML object, puede recuperar
una referencia a la instancia del complemento en el DOM HTML haciendo referencia a su identificador (ID).
En el ejemplo de JavaScript siguiente se muestra cmo recuperar los identificadores (ID) del complemento
Silverlight utilizando el mtodo document.getElementById.
var plugin_1 = document.getElementById("SLPlugin_1");
En el caso de la API administrada, antes de que se analice el XAML, un compilador de marcado lo compila
en el equipo del programador.
Cuando el XAML se carga y se analiza en tiempo de ejecucin en el cliente, el analizador crea un rbol de
objetos a partir del marcado. El rbol de objetos tendr un objeto UserControl como raz. De hecho, incluir
una instancia de una subclase UserControl concreta: la clase Page a la que se hace referencia en el atributo
x:Class del elemento raz.
Al interactuar con la aplicacin basada en Silverlight en tiempo de ejecucin, se usa la API administrada de
Silverlight para obtener acceso a la clase Page. Tambin es posible extenderse ms all de la raz Page del
rbol de objetos inmediato y obtener acceso al objeto Application. Application proporciona acceso a los
distintos aspectos de una aplicacin basada en Silverlight que se desea conservar incluso aunque se
reemplace toda la pgina metafrica de la interfaz de usuario que se muestra en el rea de contenido de
Silverlight. Application incluye recursos de nivel de aplicacin, acceso al paquete que contiene los
componentes de la aplicacin y objetos que se conectan al DOM HTML.
XAML dinmico
Para algunos escenarios de API administradas, se puede cargar XAML dinmico, es decir, un archivo XAML
que se incluye como contenido en un paquete de Silverlight XAP o bien al que se obtiene acceso mediante
una direccin URL. Este XAML no puede declarar x:Class ni utilizar cdigo subyacente. Ejemplos de
escenarios de esta situacin son los diccionarios de recursos combinados, los recursos especficos del
usuario o las cadenas de contenido de Load. La relacin de este XAML dinmico con el resto del rbol de
objetos depende del escenario exacto y no se describe aqu.
API de JavaScript
En el ejemplo siguiente se crea una jerarqua de marcado que contiene el objeto raz Canvas. Este ejemplo
est especficamente diseado para la API de JavaScript y representa un archivo XAML individual
proporcionado por el mismo servidor que la pgina HTML donde se hospeda Silverlight. En este caso, el
archivo XAML no se empaqueta ni se compila con un compilador de marcado.
<StackPanel
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
<Rectangle
Width="200" Height="35"
Fill="PowderBlue" />
<TextBlock
Foreground="Teal" FontFamily="Verdana" FontSize="18"
FontWeight="Bold"
Text="Sample Output" />
</StackPanel>
Este XAML tambin define una interfaz de usuario bsica. De hecho, es visualmente idntico al ejemplo
anterior. Cuando se analiza este XAML, el analizador crea un rbol de objetos a partir del marcado. Este
rbol de objetos tendr StackPanel como elemento raz.
Al interactuar con la aplicacin basada en Silverlight en tiempo de ejecucin, no se obtiene acceso
inmediato al rbol de objetos completo. Se tiene acceso a la variable que podra haberse creado para hacer
referencia al complemento de Silverlight en el DOM pero, de lo contrario, el acceso al modelo de
programacin suele realizarse a travs del sender de un controlador de eventos. Este sender es un objeto
que est incluido dentro del rbol de objetos y que es accesible para cualquier API de Silverlight. Pero
sender no suele ser accesible para el DOM HTML; el DOM se detiene en el nivel de la etiqueta object del
host.
La API de JavaScript usa cualquier referencia Name / x:Name en tiempo de ejecucin, pero su nico uso
inicial es actuar como destinos de las llamadas a FindName. Solo despus de haber llamado a FindName
tendr un objeto real en el rbol de objetos; antes, el nombre de un objeto es simplemente una cadena, y
no un objeto. Por convencin, suele usarse un nombre de variable idntico a la cadena utilizada para Name
y esta convencin le resultar de gran utilidad si alguna vez tiene que migrar cdigo subyacente de
JavaScript a cdigo subyacente administrado utilizando el mismo XAML.
Silverlight no tiene que hospedarse necesariamente en un explorador. Tambin es posible implementar una
aplicacin basada en Silverlight fuera del explorador, o escribir un marco de host alternativo. En estos casos,
puede que no est disponible el DOM completo y ni sus posibilidades de scripting.
Requisitos previos
Debe leer el tema Modelos de aplicacines y programacin y entender las diferencias bsicas entre la API
administrada y la API de JavaScript. Tambin debe conocer el DOM HTML y saber cmo los modelos de
programacin y el rbol de objetos de Silverlight se relacionan con el DOM del explorador.
presentacin sin activar el CRL y los ensamblados relacionados de Silverlight, con lo que se acorta el tiempo
de inicio.
Contenido y mantenimiento de aplicaciones de la poca de Silverlight 1.0
El complemento Silverlight 2 admite un modo de compatibilidad para aplicaciones escritas en la poca de
Silverlight 1.0. En particular, el complemento se puede inicializar tomando como base la cadena de era de
Silverlight 1.0 para la application pasada al elemento object, una versin de "1.0" pasada a Silverlight.js para
su inicializacin, o ambas cosas. En general, los sitios que se escribieron originalmente para Silverlight 1.0
deberan continuar funcionando en clientes que dispongan del complemento Silverlight 2.
Nota:
Si utiliza Silverlight.js para la inicializacin, debe considerar la posibilidad de actualizar el archivo
Silverlight.js utilizado en la implementacin original, porque puede haber habido actualizaciones de la
lgica de script que se encarga de las cadenas de agente para distintos exploradores y otros cambios
tcnicos producidos desde la versin Silverlight 1.0.
Silverlight 2 sigue siendo compatible con la API de JavaScript proporcionando a JavaScript el acceso al rbol
de objetos y admitiendo un valor Source que especifique una nica pgina XAML. Si tiene una aplicacin de
la poca de Silverlight 1.0 y simplemente agrega algunas mejoras o caractersticas concretas, el proceso de
toma de decisiones comerciales y tcnicas podra determinar que lo mejor es introducir las nuevas
caractersticas en la base de cdigo existente y continuar utilizando la API de JavaScript.
Nivel de experiencia del programador
Si tiene amplia experiencia con JavaScript, la mejor manera de sacar partido a sus conocimientos sera
continuar usando la API de JavaScript. Sin embargo, muchas caractersticas que se encuentran en
Silverlight 2 requieren la API administrada y no estn disponibles para JavaScript.
Otras consideraciones
Si el uso que realiza del contenido de Silverlight en una pgina HTML mayor tiene requisitos relativamente
mnimos o si utiliza ampliamente DOM HTML para integrar muchas reas de contenido HTML diferentes y
otros complementos o controles en una sola pgina, el proceso de toma de decisiones podra determinar
que la API de JavaScript proporciona la solucin de integracin ms rentable.
crear estos objetos creando instancias de XAML y, seguidamente, script para el rbol de objetos. Para
utilizar estos objetos, el cliente que ejecuta la aplicacin basada en Silverlight tambin debe ser un cliente
de Silverlight versin 2.
Los objetos adicionales para la API de JavaScript se incluyen en la API de JavaScript para la documentacin
de Silverlight (as como las propiedades, los mtodos, los eventos y las enumeraciones). Estos se
documentan en un nivel bsico. Los nuevos objetos y miembros llevan anotada una seccin de informacin
de versin en las pginas de referencia, mientras que los objetos y los miembros existentes en la versin 1.0
no tienen una seccin de informacin de versin.
En XAML, la API que se usa (administrada o de JavaScript) afecta a la tcnica de especificacin de los
controladores de eventos. La API es mutuamente excluyente en un nivel de pgina XAML. La seal por la
que se usa la API es la presencia o ausencia del atributo x:Class en el elemento raz de una pgina XAML. Si
existe x:Class, la pgina usa la API administrada. Si x:Class no est presente, la pgina usa la API de
JavaScript.
En el ejemplo de XAML siguiente se muestra cmo agregar un controlador para el evento Loaded para
Canvas, que en este ejemplo es la raz de un archivo de XAML. La ausencia de x:Class en esta raz indica el
uso de la API de JavaScript. La resolucin del nombre de funcin se aplaza por tanto al tiempo de ejecucin.
En tiempo de ejecucin, cuando se produce el evento, se comprueba el mbito de scripting de JavaScript en
busca de un miembro denominado "onLoaded" y se ejecuta dicha funcin.
<Canvas xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" Loaded="onLoaded" />
La funcin denominada onLoaded se define en un archivo de JavaScript. Este archivo de JavaScript est
asociado al HTML de la pgina de hospedaje a travs del parmetro src de la etiqueta <SCRIPT> del HTML.
Esto es necesario porque se trata del host del explorador que realmente est interpretando el script; el
complemento Silverlight es solamente un intermediario en el procesamiento de la API de JavaScript y no
proporciona el motor de scripts real. No hay nada en el XAML que deba hacer referencia a un archivo de
JavaScript concreto; solo es pertinente en el explorador y en el DOM.
<!-- Reference the JavaScript file where the event functions are defined
from the plug-in host HTML page. -->
<script type="text/javascript" src="eventfunctions.js">
...
</script>
fragmento XAML que se crea est desconectado del rbol de objetos de Silverlight. Esto significa que el
fragmento todava no se representa. Sin embargo, incluso antes de agregarlo al rbol de objetos, puede
modificar las propiedades de los objetos en el fragmento XAML. Los mtodos de los objetos no se pueden
invocar antes de conectar el rbol.
Despus de haber creado un conjunto de objetos desconectado del fragmento XAML, por lo general suele
ser conveniente agregarlo al rbol de objetos de Silverlight activo. El fragmento se puede agregar como un
objeto secundario a un objeto primario, o bien puede establecer un valor de la propiedad de un objeto.
Cuando el fragmento forma parte del rbol de objetos de Silverlight, se representan los objetos del
fragmento XAML. Dependiendo de la extensin del cdigo XAML proporcionado como informacin para
CreateFromXaml, puede crear un objeto Silverlight nico, como TextBlock, o bien un rbol complejo de
objetos de Silverlight.
Hay varios requisitos para agregar dinmicamente contenido de XAML al rbol de objetos de Silverlight:
Debe haber contenido XAML existente asociado al complemento Silverlight. No se puede utilizar
CreateFromXaml para reemplazar el rbol de contenido completo; debe conservar el elemento raz
original por lo menos. Si desea reemplazar todo el rbol, puede establecer Source, pero tenga en
cuenta que Source requiere que exista un archivo real en un URI y este no se puede inicializar
simplemente con una cadena. Sin embargo, puede solucionar este problema utilizando cdigo
XAML insertado como Source y empleando el DOM HTML para aplicar el mtodo document.write
al contenido del bloque SCRIPT que contiene el cdigo XAML de origen deseado.
El mtodo CreateFromXaml solamente se puede invocar a travs del complemento Silverlight. Sin
embargo, en la API de JavaScript resulta sencillo obtener una referencia de objeto al complemento:
basta con llamar a GetHost para cualquier objeto de Silverlight.
El contenido de XAML que se crea con el mtodo CreateFromXaml solamente puede estar asignado
a un objeto. Si desea agregar objetos creados a partir de cdigo XAML idntico a reas diferentes
de la aplicacin, debe invocar CreateFromXaml varias veces y utilizar variables diferentes para el
valor devuelto. (Si lo hace, tenga cuidado con los conflictos de nombres; vea la seccin Crear
mbitos de nombres con CreateFromXAML ms adelante en este mismo tema).
El objeto de Silverlight que incluir el nuevo contenido de XAML debe ser capaz de encapsular un
objeto, como un elemento secundario o como un valor de propiedad.
La cadena que especifique para xamlContent de CreateFromXaml debe especificar cdigo XML con
el formato correcto (en concreto, debe tener un nico elemento raz). CreateFromXaml producir
un error si la cadena XML proporcionada no tiene el formato correcto.
El elemento raz utiliza implcitamente el espacio de nombres XML de Silverlight. Puede establecer
el espacio de nombres de Silverlight explcitamente, pero no establezca el espacio de nombres XML
predeterminado en ningn otro valor distinto del espacio de nombres de Silverlight.
que se usa para crear un rbol de objetos desconectado crear igualmente un mbito de nombres XAML
preliminar que evala todos los nombres definidos en el cdigo XAML proporcionado para comprobar que
son nicos. Si los nombres del cdigo XAML proporcionado no son nicos internamente en este punto,
CreateFromXaml produce un error. La diferencia en el comportamiento es que el rbol de objetos
desconectado ahora est marcado para evitar que se combine su mbito de nombres XAML con el mbito
de nombres XAML primario cuando se conecte al rbol de objetos de la aplicacin principal. De hecho,
despus de conectar los rboles, la aplicacin tendr un rbol de objetos unificado pero mbitos de
nombres XAML discretos. Un nombre definido en la raz de CreateFromXaml o en cualquier objeto del rbol
previamente desconectado no se asocia al mbito de nombres XAML primario; tiene su propio mbito de
nombres XAML discreto.
La complicacin de tener mbitos de nombres XAML discretos es que las llamadas al mtodo FindName ya
no funcionan con un mbito de nombres unificado. En lugar de ello, el objeto en concreto en el que se
llama a FindName definir implcitamente el mbito, y el mbito ser el mbito de nombres XAML donde
reside el objeto que realiza la llamada. Por tanto, si intenta llamar a FindName para obtener un objeto con
nombre en el mbito de nombres XAML primario, no se encontrarn los objetos de un mbito de nombres
XAML discreto creado por CreateFromXaml. A la inversa, al llamar a FindName desde el mbito de nombres
XAML discreto no se encontrarn los objetos con nombre del mbito de nombres XAML primario. El
mtodo FindName definido en el objeto de complemento Silverlight no evita totalmente este problema; su
mbito de nombres XAML siempre es el mbito de nombres XAML primario.
Este problema de mbitos de nombres XAML discretos solamente afecta a los mbitos de nombres XAML y
a la llamada a FindName. Todava puede recorrer la estructura del rbol de objetos de forma ascendente en
algunos casos llamando al mtodo GetParent o de forma descendente realizando llamadas en las
propiedades o propiedades de coleccin pertinentes (como la coleccin devuelta por Canvas.Children).
Para llegar a los objetos que se definen en un mbito de nombres XAML discreto, puede emplear varias
tcnicas:
Recorrer el rbol de objetos con GetParent y/o propiedades de coleccin.
Si va a realizar la llamada desde un mbito de nombres XAML discreto y desea obtener el mbito
de nombres XAML primario, le resultar sencillo obtener una referencia al complemento Silverlight
y, a continuacin, llamar a FindName en esta referencia. La llamada de script concatenada para
realizar esta operacin se incluye en una nica lnea:
returnedObject = objeto .GetHost().content.FindName("nameToFind");
donde objeto es el objeto que realiza la llamada en un mbito de nombres XAML discreto. .content
en esta sintaxis es el paso a travs del subobjeto de complemento Silverlight especfico que define
el mtodo FindName.
Si va a realizar la llamada desde el mbito de nombres XAML primario y desea obtener un objeto
dentro de un mbito de nombres XAML discreto, debe planear con antelacin esta operacin en el
cdigo y conservar una referencia al objeto devuelto por CreateFromXaml. Este objeto es ahora un
objeto vlido para llamar a FindName dentro del mbito de nombres XAML discreto. Puede
mantener este objeto como una variable global o pasarlo de algn otro modo mediante
parmetros de mtodo.
Nota importante:
El cdigo XAML insertado es un concepto que solo es utilizable con la API de JavaScript para Silverlight. El
cdigo XAML insertado no es compatible con la API administrada para Silverlight.
administrado, que especifique x:Class en su raz, no hay modo de que una solucin de XAML insertado sepa
cmo conectar el cdigo subyacente y el XAML, y ninguna instruccin concreta para compilar y conectar el
cdigo administrado.
Para utilizar XAML insertado, debe agregar el XAML en un bloque < SCRIPT > especial y especificar
"text/xaml" como atributo type. La declaracin de tipos del documento XML, <?xml version="1.0"?>,
precede el contenido XAML. Se debe identificar el contenido XAML de forma nica para que el parmetro
de inicializacin de Source del complemento Silverlight pueda hacer referencia a l. El parmetro source
utiliza el prefijo "#" seguido por el valor id en el elemento < SCRIPT > para identificar el contenido XAML. El
contenido XAML tambin puede definir eventos que hacen referencia a controladores de eventos en la
pgina HTML.
En el siguiente ejemplo HTML se muestra cmo crear contenido de cdigo XAML insertado. En este caso, la
pgina HTML incluye JavaScript y contenido XAML. Tenga en cuenta la construccin del elemento object
que especifica el parmetro source.
Nota:
El elemento < SCRIPT > que incluye el contenido XAML insertado debe preceder al elemento HTML que
contiene el complemento Silverlight, que hace referencia al XAML insertado para la inicializacin del origen.
<html>
<head>
<title>Display Date</title>
<!-- Define Loaded event handler for TextBlock. -->
<script type="text/javascript">
function setDate(sender, eventArgs)
{
sender.text = Date();
}
</script>
</head>
<body bgcolor="Teal">
<!-- Define XAML content. -->
<script type="text/xaml" id="xamlContent"><?xml version="1.0"?>
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
Background="Wheat">
<TextBlock
Canvas.Left="20"
FontSize="24"
Loaded="setDate" />
</Canvas>
</script>
<div id="silverlightControlHost">
<object type="application/x-silverlight" width="100%" height="100%" id="slc">
<param name="source" value="#xamlContent"/>
<param name="onload" value="onLoaded" />
<param name="iswindowless" value="true" />
</object>
<iframe style='visibility:hidden;height:0;width:0;border:0px'></iframe>
</div>
</body>
</html>
Cuando se muestra esta pgina, se carga el complemento Silverlight y se genera el evento Loaded para el
objeto TextBlock, que hace que TextBlock muestre la fecha y la hora.
propiedades y propiedades adjuntas para la API de JavaScript, y el uso de los mtodos de utilidad
GetValue/SetValue.
GetValue y SetValue
Las propiedades del modelo de objetos de Silverlight se exponen a JavaScript a travs de una notacin
objeto.propiedad similar a muchos otros modelos de programacin en explorador. Dado que se basa en
prototipos, tambin es posible establecer valores de propiedad no incluidos en la API en cualquier objeto
de JavaScript y obtener ese valor posteriormente.
La API de JavaScript para Silverlight tambin proporciona dos mtodos de descriptor de acceso, GetValue y
SetValue, que obtienen y establecen las propiedades pasando el nombre de propiedad relevante como una
cadena. Estos mtodos realmente proporcionan una implementacin de "contenedor" intermedia que
procesa JavaScript en objetos nativos para Silverlight, pero se exponen como parte de la API del usuario
general porque, en ocasiones, resultan tiles para ciertos escenarios. Se proporcionan ejemplos de uso en
las pginas de referencia de GetValue y SetValue, en caso de que se encuentre ante un escenario de este
tipo. Dicho esto, en general no necesitar crear instancias para usar los mtodos GetValue / SetValue. La
notacin objeto.propiedad para obtener y establecer propiedades es equivalente y suele ser ms intuitiva.
Nota:
Si est familiarizado con WPF o con la API administrada para Silverlight, es probable que conozca los
mtodos SetValue y GetValue que forman parte del sistema de propiedades. Estos mtodos no son
exactamente equivalentes a los mtodos GetValue/SetValue de JavaScript de Silverlight. En WPF o en la API
administrada para Silverlight, los mtodos GetValue y SetValue solo pueden actuar en propiedades de
dependencia, mientras que los mtodos GetValue/SetValue pueden actuar en cualquier propiedad de
Silverlight disponible en la API de JavaScript.
En XAML, en el nivel de elemento, no existe ninguna diferencia en cuanto a la forma de hacer referencia al
controlador entre la API administrada y la API de JavaScript. En ambos casos, se proporciona una cadena
que designa una funcin (o un mtodo) del controlador de eventos.
definiciones de sender que puede ver en la documentacin bsica de .NET Framework acerca de los eventos
de CLR, donde sender es el objeto que gener el evento. Esto ltimo no es necesariamente cierto en el caso
de un evento enrutado; el evento podra haber sido generado por un objeto secundario del rbol de
objetos y haberse enrutado ascendentemente. Este concepto de evento enrutado tambin se describe a
veces en la documentacin de Silverlight y de WPF como un evento de propagacin.
referencia al objeto con nombre en el rbol de objetos extendido. En el siguiente XAML se crea un rbol de
objetos con un TextBlock con nombre y un controlador de eventos en el Canvas primario.
<Canvas
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Loaded="onLoaded">
<TextBlock x:Name="myTextBlock" />
</Canvas>
En el ejemplo de JavaScript siguiente se muestra cmo usar el mtodo FindName para buscar un objeto con
nombre concreto en el rbol de objetos de Silverlight. En este caso, el cdigo muestra la fecha actual como
la propiedad Text del objeto TextBlock.
function onLoaded(sender, eventArgs)
{
// Set the TextBlock to display the current date and time.
sender.findName("myTextBlock").text = Date();
}
En el ejemplo anterior, es posible que haya observado los "tokens" devueltos. En algunas circunstancias, es
posible que desee quitar los controladores de eventos. Puede hacerlo si tiene pensado reemplazar un
controlador de eventos previamente agregado por una funcin de control diferente. Para quitar una funcin
de controlador de eventos existente, use el mtodo RemoveEventListener. En el ejemplo de JavaScript
siguiente se muestra cmo quitar los controladores de dos eventos diferentes de un objeto TextBlock.
function removeEvents()
{
textBlock.removeEventListener("MouseEnter", entertoken1);
textBlock.removeEventListener("MouseLeave", leavetoken1);
}
Tenga en cuenta el modo en que el cdigo destinado a quitar el controlador de eventos hace referencia a
los mencionados tokens que se declararon como variables en el cdigo anterior destinado a agregar
controladores de eventos. En realidad, los tokens son simplemente valores enteros. Los tokens los
devuelven las llamadas a AddEventListener, puesto que puede resultar necesario diferenciar los
controladores si se define ms de un controlador para el mismo evento en la misma instancia. Si no tiene
intencin de quitar los controladores posteriormente, no es necesario que almacene los tokens devueltos
por la llamada a AddEventListener.
Tambin puede quitar los controladores en casos en los que el evento se haya agregado a travs de un
atributo de evento XAML. En el caso de un atributo de evento XAML, no hay ninguna llamada de funcin
que pueda devolver un token. Sin embargo, puede proporcionar el valor 0 (cero) al parmetro token para
quitar un evento en el que se agreg el controlador utilizando un atributo XAML. Los tokens representan el
orden en que se agregaron los controladores, de 0 en adelante. Dado que los controladores de atributos
XAML son los primeros controladores que se agregan (el anlisis de XAML tiene lugar antes de que
cualquier script pueda agregar controladores) y dado que solo puede agregarse un controlador de eventos
por evento/instancia utilizando XAML, el valor token del controlador de eventos agregado por XAML
siempre es 0.
Nota:
El DOM de Gecko admite un mtodo DOM en muchos elementos que tambin se denominan
AddEventHandler y tiene un propsito conceptual similar. La versin Gecko del DOM se diferencia de
AddEventHandler de Silverlight en que la versin Gecko del DOM tiene tres parmetros y la versin de
Silverlight tiene dos. No es posible usar la versin Gecko del DOM de AddEventHandler para agregar
controladores de objetos en el rbol de objetos de Silverlight. No obstante, puede usarla para agregar
controladores a cualquier elemento de la pgina HTML que realmente se encuentre en el DOM HTML.
En este ejemplo, el cdigo de JavaScript se define insertado, en lugar de hacer referencia a una funcin de
controlador de eventos. Esto no es posible con los eventos de Silverlight; es necesario definir funciones y
hacer referencia a ellas.
Adems, tenga en cuenta la similitud que existe entre el evento del DOM HTML onload y el evento Loaded
de Silverlight. El evento onload del DOM HTML no se genera hasta que la pgina web se ha cargado por
completo. Esto significa que cualquier complemento Silverlight incluido dentro de la pgina generar su
evento Loaded antes que el evento onload del DOM HTML.
Eventos de error
Los errores de la API de JavaScript pueden controlarse a menudo escribiendo un controlador para el evento
OnError definido para el objeto de complemento Silverlight. Los eventos de error siempre incluyen los datos
del evento en forma de ErrorEventArgs que se encuentran disponibles para el controlador de errores, y los
eventos del analizador y los eventos en tiempo de ejecucin proporcionan las subclases especializadas
ParserErrorEventArgs o RuntimeErrorEventArgs respectivamente.
forma predeterminada. Al crear el emisor, debe identificar el receptor correspondiente. Si solo especifica un
nombre, el emisor supondr que el receptor se hospeda en el mismo dominio y que utiliza un nombre cuyo
nombre est asignado al dominio.
El mbito de nombres garantiza que el receptor va a recibir nicamente los mensajes dirigidos al mismo. Es
posible usar el mbito global si no se desea restringir las aplicaciones a dominios concretos. Sin embargo,
esto aumenta la posibilidad de que se produzcan conflictos de nombres, a menos que se elijan nombres
que tengan probabilidad de ser nicos. El mbito de dominio permite elegir nombres de receptor ms
simples si se est familiarizado con todas las aplicaciones basadas en Silverlight que se hospedan en un
dominio.
En el ejemplo de cdigo siguiente se muestra una configuracin bsica donde las aplicaciones emisora y
receptora se hospedan en el mismo dominio.
' In the receiving application:
Dim messageReceiver As New LocalMessageReceiver("receiver")
' In the sending application:
Dim messageSender As New LocalMessageSender("receiver")
Puede crear varios objetos receptores y emisores. Cada receptor puede recibir los mensajes de cualquier
nmero de emisores. Cada emisor, sin embargo, solo puede enviar mensajes al receptor identificado en su
constructor. Adems, puede configurar el receptor de forma que reciba nicamente los mensajes de los
dominios emisores especificados, o desde cualquier dominio.
En el ejemplo siguiente se muestra una configuracin ms compleja en virtud de la cual las aplicaciones
emisora y receptora se pueden hospedar en el mismo dominio o en dominios diferentes.
' In the receiving application:
Dim messageReceiver As New LocalMessageReceiver("receiver", ReceiverNameScope.Global,
LocalMessageReceiver.AnyDomain)
' In the sending application:
Dim messageSender As New LocalMessageSender("receiver", LocalMessageSender.Global)
En este ejemplo, el receptor recibe un nombre en el mbito global y puede recibir mensajes de cualquier
dominio. Tambin el emisor especifica el mbito global. El mbito global resulta til para que el emisor no
tenga que saber cul es el dominio del receptor. Sin embargo, cuando se utiliza el mbito global se deben
elegir cuidadosamente los nombres de los receptores, a fin de evitar la posibilidad de conflictos. Para
obtener ms informacin, vea la seccin "Escenarios avanzados y solucin de problemas" ms adelante en
este mismo tema.
Despus de crear los objetos emisores y receptores, agregue controladores de los eventos LocalMessage
Sender.SendCompleted y LocalMessageReceiver.MessageReceived para completar la configuracin. Estos
eventos se describen en la seccin siguiente.
Cuando el receptor est talmente configurado, llame al mtodo LocalMessageReceiver.Listen. Este mtodo
registra la identidad del receptor y le permite recibir los eventos MessageReceived. Este mtodo tambin
inicia una excepcin ListenFailedException si ya hay un receptor registrado con el mismo nombre y mbito
de nombres. Por ejemplo, esto puede suceder si se usa un nombre codificado de forma rgida y un usuario
carga al mismo tiempo la pgina web host en ms de una ventana o pestaa del explorador. Para obtener
ms informacin, vea la seccin "Escenarios avanzados y solucin de problemas".
No se puede modificar la configuracin del receptor despus de llamar al mtodo Listen. El receptor seguir
recibiendo mensajes hasta que se llame a su mtodo Dispose.
En el ejemplo de cdigo siguiente se muestran los detalles de configuracin completos donde las
aplicaciones emisora y receptora se hospedan en el mismo dominio.
' In the receiving application:
Dim messageReceiver As New LocalMessageReceiver("receiver")
AddHandler messageReceiver.MessageReceived, AddressOf receiver_MessageReceived
Try
messageReceiver.Listen()
Catch ex As ListenFailedException
MessageBox.Show("Cannot receive messages." & Environment.NewLine & _
"There is already a receiver with the name 'receiver'.", "LocalMessageReceiver", MessageBoxButton.OK)
End Try
' In the sending application:
Dim messageSender As New LocalMessageSender("receiver")
AddHandler messageSender.SendCompleted, AddressOf sender_SendCompleted
No es necesario que el emisor controle el evento SendCompleted. Sin embargo, si lo hace, el evento se
produce con independencia de si el mensaje se recibe correctamente o no, y de si el receptor enva una
respuesta o no. No obstante, si el mensaje no se recibe, la propiedad AsyncCompletedEventArgs.Error
(heredada por la clase SendCompletedEventArgs) se establecer en una instancia de SendFailedException.
Por ejemplo, esto se puede producir si no se ha registrado el nombre del destinatario especificado o si no
est configurado para recibir los mensajes del dominio del remitente.
Diagrama de ejemplo
En el diagrama siguiente se resumen los comportamientos descritos en las secciones anteriores.
Con la mensajera local entre dominios, a veces es preciso tomar precauciones adicionales para evitar
conflictos de nombre o la asuncin del control de mensajes. Recuerde que la primera aplicacin que registra
el nombre de un receptor dentro de un mbito de nombres determinado recibir los mensajes dirigidos a
esa identidad. Esto podra provocar problemas si una aplicacin desconocida con la misma identidad ya
est abierta en otra ventana o pestaa del explorador cuando se carga la aplicacin.
Si se utiliza el mbito de nombres global, debe evitarse el uso de nombres de receptor comunes. Si la
seguridad es una cuestin importante, puede ser conveniente utilizar mbitos de nombres de dominio y
restringir los dominios desde los que el receptor puede recibir mensajes. Por ltimo, debe evitarse el envo
de informacin confidencial a travs de un canal de mensajera local no cifrado.
Enviar mensajes complejos
Con la mensajera local, se puede enviar cualquier cadena de hasta 40 kilobytes. En muchas situaciones, el
mensaje tendr que ser solamente una notificacin simple o un conjunto de valores simple que el receptor
puede analizar e interpretar con facilidad. Sin embargo, dentro del lmite de 40 kilobytes, pueden enviarse
mensajes arbitrariamente complejos, incluso objetos serializados y mensajes cifrados.
Silverlight proporciona API para serializar y deserializar datos XML o JSON. Se trata de formatos de datos
comunes cuando se trabaja con servicios Web. Aunque la mensajera local tiene lugar por completo en un
equipo nico, estos formatos de datos se pueden utilizar de la misma manera que con un servicio Web.
Trabajar con datos XML resulta particularmente fcil porque Silverlight incluye LINQ to XML. Sin embargo,
los datos XML ocupan ms espacio, de modo que si se van a serializar objetos grandes que pueden superar
el lmite de 40 kilobytes, puede ser conveniente usar JSON.
Silverlight proporciona API para criptografa en el espacio de nombres System.Security.Cryptography.
Enviar mensajes durante el inicio de la aplicacin
Segn su tamao, las aplicaciones emisora y receptora podran terminar de cargarse en momentos distintos.
Aunque ambas aplicaciones sean pequeas, no hay ninguna garanta de que la aplicacin receptora est
disponible cuando la aplicacin emisora est lista para enviar. Si necesita enviar un mensaje local durante el
tiempo de inicio de la aplicacin, debe tener esto en cuenta.
Una manera de evitar este problema es hacer que la aplicacin emisora enve el mensaje repetidamente
hasta que se reciba. Para ello, puede reenviar el mensaje en el controlador de eventos SendCompleted si la
propiedad AsyncCompletedEventArgs.Error no es null. Esta tcnica se utiliza en el ejemplo de cdigo de
Cmo: Implementar la comunicacin entre aplicaciones locales basadas en Silverlight.
Otro enfoque es utilizar la caracterstica Puente HTML para comunicarse a travs de la pgina web host y
avisar a la aplicacin emisora cuando se haya cargado la aplicacin receptora. Obviamente, podra utilizar
Puente HTML como canal de comunicacin en lugar de la mensajera local. Sin embargo, la mensajera local
suele ser ms conveniente una vez que el emisor ha determinado que el receptor est disponible y
preparado para recibir mensajes. Tambin debe tenerse en cuenta que la caracterstica Puente HTML
requiere una pgina HTML host, de modo que no funciona con aplicaciones de ejecucin fuera del
explorador.
Evitar conflictos de nombres con varias instancias de una misma aplicacin web
En algunos casos, puede ser necesario permitir que los usuarios ejecuten ms de una instancia de la
aplicacin web a la vez. En este caso, se precisar cdigo adicional para asegurarse de que las instancias de
LocalMessageReceiver tengan nombres nicos.
Tal y como se ha mencionado, se puede controlar la excepcin ListenFailedException iniciada por el mtodo
LocalMessageReceiver.Listen para determinar si ya se ga registrado un nombre de receptor. Esto resulta til
si, sencillamente, desea deshabilitar la mensajera local para las instancias adicionales de la aplicacin web.
No obstante, si desea que las instancias adicionales se ejecuten normalmente, deber generar nombres de
receptor nicos para esas instancias.
En este caso, puede generar los nombres de receptor en JavaScript, utilizando la fecha y hora actuales para
asegurar su singularidad. A continuacin, puede recuperar los nombres generados en las aplicaciones
emisora y receptora por medio de la caracterstica Puente HTML.
Imports System
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Messaging
<UserControl x:Class="ReceivingApplication.Receiver"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel x:Name="LayoutRoot">
<TextBlock Text="Receiver" FontSize="20" />
<TextBlock x:Name="output"/>
</StackPanel>
</UserControl>
Imports System
Imports System.Windows.Controls
Imports System.Windows.Messaging
Una aplicacin de ejecucin fuera del explorador se puede ejecutar sin que haya una conexin de red. Si la
aplicacin suele utilizar recursos basados en red, se puede implementar la deteccin de la red y
proporcionar compatibilidad sin conexin cuando esta ltima no est disponible. Por ejemplo, puede utilizar
el almacenamiento aislado a modo de memoria cach sin conexin que se sincronice con un almacn de
datos basado en servidor cuando se reanude la conexin. Cuando la conexin est disponible, tambin
puede comprobarse si hay actualizaciones para la aplicacin.
Asimismo, se puede configurar una aplicacin de ejecucin fuera del explorador de modo que requiera
confianza elevada. Las aplicaciones de confianza pueden omitir algunas de las restricciones del espacio
aislado de seguridad. Por ejemplo, las aplicaciones de confianza pueden utilizar el modo de pantalla
completa sin restricciones de teclado.
Nota:
Las aplicaciones de ejecucin fuera del explorador estn sometidas a las mismas restricciones de espacio
aislado que las aplicaciones normales de ejecucin en explorador. Para flexibilizar algunas de estas
restricciones, se debe configurar la aplicacin de modo que requiera confianza elevada. Sin embargo, si se
necesita acceso no restringido al equipo del usuario o se precisan otras capacidades adems de las
proporcionadas por Silverlight, puede ser conveniente utilizar Windows Presentation Foundation (WPF).
Como alternativa, se puede hospedar el complemento Silverlight dentro de otra aplicacin.
Las aplicaciones de ejecucin fuera del explorador pueden tener acceso a los recursos de la red por HTTPS
cuando hay una conexin disponible. Sin embargo, en este momento no existe ningn indicador integrado
de la presencia de un canal seguro y se puede suplantar cualquier indicador que se proporcione. Las
aplicaciones de ejecucin fuera del explorador son tan seguras como los sitios web donde se hospedan. Por
consiguiente, los usuarios deben basarse en la seguridad del sitio host al instalar o actualizar una aplicacin
de ejecucin fuera del explorador. Si la aplicacin trata informacin confidencial, debera usar HTTPS para el
URI de la aplicacin y para las comunicaciones seguras. Observe que siempre se utiliza el identificador URI
(incluido el protocolo) de la aplicacin original cuando la aplicacin comprueba si hay actualizaciones.
Sin embargo, si se configura la aplicacin de modo que requiera confianza elevada, aparecer un cuadro de
dilogo con una advertencia de seguridad. Este cuadro de dilogo contiene las mismas opciones de acceso
directo, pero adems informa al usuario de que la aplicacin tendr mayor acceso al equipo.
El nombre de aplicacin que aparece en el men contextual y en el cuadro de dilogo corresponde al
nombre del acceso directo en la configuracin de ejecucin fuera del explorador. La imagen que aparece en
el cuadro de dilogo corresponde al icono ms grande de la configuracin. Si no especifica ningn icono en
la configuracin, se utiliza el icono predeterminado, como se muestra en la imagen del ejemplo.
Es posible mostrar el cuadro de dilogo de instalacin mediante programacin llamando al mtodo
Application.Install. Sin embargo, esto funciona solamente dentro de un controlador de eventos para un
evento iniciado por usuario y nicamente si se ha configurado correctamente la aplicacin.
Nota:
Los administradores del sistema pueden deshabilitar la capacidad para instalar aplicaciones de confianza. En
ese caso, cuando se intentan instalar dichas aplicaciones, la instalacin no se lleva a cabo y el mtodo Install
devuelve false.
Hay varias razones para proporcionar una experiencia de instalacin personalizada para las aplicaciones de
ejecucin fuera del explorador:
Para asegurarse de que pueda detectarse la opcin de instalacin de aplicaciones de ejecucin
fuera del explorador.
Para describir lo que se va a instalar y la duracin de la instalacin.
Para indicar si alguna funcionalidad requiere una conexin de red activa.
Los ltimos dos puntos son sobre todo importantes para las aplicaciones donde no quedan claros los
lmites entre el sitio web, la aplicacin y el contenido. Por ejemplo, se debe comunicar a los usuarios si estn
descargando una biblioteca completa de vdeos o simplemente un explorador de vdeos que requiere una
conexin de red.
Si controla el evento MouseRightButtonDown, se suprime automticamente el men contextual de la
aplicacin. En ese caso, deber proporcionar una interfaz de usuario propia para la instalacin de
aplicaciones de ejecucin fuera del explorador. Si no controla el evento MouseRightButtonDown y desea
suprimir la opcin de instalacin del men contextual, establezca la propiedad OutOfBrowserSettings.
ShowInstallMenuItem en false en la configuracin de la ejecucin fuera del explorador.
Para la instalacin de ejecucin fuera del explorador se necesita la aceptacin del usuario, de modo que el
cuadro de dilogo de instalacin no se puede deshabilitar. Sin embargo, puede tener acceso a los datos de
configuracin por medio de la propiedad Deployment.OutOfBrowserSettings si desea mostrarlo en su
propia interfaz de usuario.
No se necesitan privilegios de administrador para realizar una instalacin de ejecucin fuera del explorador.
Cuando un usuario instala una aplicacin, se coloca una copia de ella en una memoria cach de aplicacin
de ejecucin fuera del explorador situada en la carpeta de perfil del usuario. Esto significa que la aplicacin
est disponible nicamente para el usuario que la instal.
El usuario puede iniciar la aplicacin mediante los accesos directos especificados en el cuadro de dilogo de
instalacin. Los accesos directos ejecutan un programa denominado sllauncher.exe, al que pasan un
identificador nico asignado a la aplicacin de ejecucin fuera del explorador. El programa sllauncher carga
la aplicacin en una ventana para cuya creacin se utilizan las propiedades de ancho, alto y texto de la barra
de ttulo especificadas en la configuracin de la ejecucin fuera del explorador.
Para quitar una aplicacin instalada, el usuario debe iniciarla, hacer clic en ella con el botn secundario y, a
continuacin, seleccionar Quitar esta aplicacin. Asimismo, puede desinstalar la aplicacin desde
Programas y caractersticas en el Panel de control. Este procedimiento es necesario si se suprime el men
contextual de la aplicacin controlando el evento MouseRightButtonDown.
Los administradores del sistema pueden utilizar la versin de Silverlight 4 de sllauncher.exe para
automatizar la instalacin de las aplicaciones de ejecucin fuera del explorador.
Para determinar si una aplicacin se ha instalado de modo que se ejecute fuera del explorador, compruebe
la propiedad Application.InstallState. Para responder a la instalacin de ejecucin fuera del explorador,
controle el evento Application.InstallStateChanged. Tambin puede determinar si una aplicacin se inici de
fuera del explorador comprobando la propiedad Application.IsRunningOutOfBrowser.
Lo habitual es deshabilitar todas las funcionalidades de la aplicacin que se basen en los servicios de red o
del explorador. Si la aplicacin almacena informacin de estado del usuario en su servidor del host mientras
est conectada, puede utilizar el almacenamiento aislado para almacenar en memoria cach los datos entre
dos ejecuciones de la aplicacin. A continuacin, puede responder a la disponibilidad de la red
sincronizando los datos en cach con el servidor. Asimismo, puede configurar la aplicacin de modo que
requiera confianza elevada, lo que permite a la aplicacin almacenar informacin de estado del usuario y
otros datos en el sistema de archivos local.
Puede utilizar la mensajera local para la comunicacin entre una aplicacin de ejecucin fuera del
explorador y una aplicacin hospedada en web. Sin embargo, en Internet Explorer, la mensajera local est
deshabilitada de forma predeterminada entre las aplicaciones que se ejecutan en diferentes zonas de
seguridad. Las aplicaciones hospedadas en web suelen ejecutarse dentro de la zona de Internet, mientras
que las de ejecucin fuera del explorador lo hacen en la zona confiable. Por consiguiente, para habilitar la
mensajera local en este escenario, debe establecer la propiedad LocalMessageReceiver.DisableSender
TrustCheck en true.
Si la aplicacin se ha iniciado desde fuera del explorador y la conectividad de red est disponible, puede
buscar actualizaciones de la aplicacin en el servidor del host.
Nota:
En general, solamente debe comprobarse si hay actualizaciones con el consentimiento del usuario, y se le
debe notificar cuando hay una disponible.
Nota:
Si una aplicacin de ejecucin fuera del explorador requiere los recursos de red que normalmente se cargan
despus del inicio, tambin necesitar implementar la compatibilidad sin conexin.
Si no especifica los valores Ancho y Alto, la ventana de la aplicacin usar un tamao predeterminado de
800x600.
Si no se especifican iconos, se usarn los iconos predeterminados. Si especifica los iconos, debera
especificar uno para cada tamao indicado en el diseador (16x16, 32x32, 48x48 y 128x128).
Los iconos deben ser archivos .png agregados al proyecto que tengan como Accin de compilacin el
valor Contenido. Adems, los archivos .png deben ser de las dimensiones indicadas. El sistema operativo
elegir el tamao ms adecuado dependiendo de cada situacin. Si no se puede cargar un icono adecuado,
aparecer el predeterminado.
Nota:
Silverlight 3 no admite las propiedades siguientes:
WindowStartupLocation
Top
Left
SecuritySettings
WindowStyle
Ejemplo
Los valores del cuadro de dilogo Configuracin de la ejecucin fuera del explorador se usan para
generar un archivo OutOfBrowserSettings.xml en la carpeta Propiedades del proyecto (Mi proyecto en
Visual Basic). Cualquier cambio en este archivo se refleja en el diseador. Este archivo se usa para incluir los
valores especificados en el manifiesto de aplicacin (AppManifest.xaml).
Para configurar una aplicacin existente para la compatibilidad con la ejecucin fuera del explorador sin
volver a compilar, agregue el XML de configuracin al manifiesto en un archivo .xap existente. Para ello,
copie el elemento de propiedad Deployment.OutOfBrowserSettings del cdigo de ejemplo siguiente en el
archivo de manifiesto y, a continuacin, actualice los valores.
Como alternativa al uso del diseador, puede especificar la configuracin de ejecucin fuera del explorador
rellenando la plantilla de manifiesto (AppManifest.xml en la carpeta Propiedades o Mi proyecto), como se
muestra en el ejemplo siguiente. De forma predeterminada, la compilacin usa la plantilla de manifiesto
para generar el manifiesto de aplicacin. Sin embargo, el XML de plantilla es ms fcil de usar en Visual
Studio.
Nota:
Si usa el cuadro de dilogo Configuracin de la ejecucin fuera del explorador, no puede especificar la
configuracin de la ejecucin fuera del explorador en el manifiesto de aplicacin o en la plantilla de
manifiesto. Si lo hace, se crear informacin duplicada en el manifiesto. Se generar un error al intentar
ejecutar la aplicacin.
<Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Deployment.Parts>
</Deployment.Parts>
<Deployment.OutOfBrowserSettings>
<OutOfBrowserSettings
ShortName="Out-of-Browser Application"
EnableGPUAcceleration="True"
ShowInstallMenuItem="True">
<OutOfBrowserSettings.Blurb>
Demonstrates the out-of-browser feature.
</OutOfBrowserSettings.Blurb>
<OutOfBrowserSettings.Icons>
Puede probar el indicador de conectividad de red en la aplicacin de ejecucin fuera del explorador si la
desconecta y la vuelve a conectar a la red. Observe que el botn de actualizacin desaparece cuando la
conexin no est disponible.
Para probar el botn de actualizacin, debera incluir un proyecto de aplicacin web en su solucin
Silverlight. Despus de instalar la aplicacin, modifique y recompile la solucin en Visual Studio, y, a
continuacin, haga clic en el botn de instalacin para descargar la actualizacin.
<UserControl x:Class="OutOfBrowser.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel x:Name="LayoutRoot" Background="White" Margin="20">
<TextBlock x:Name="networkIndicator" FontWeight="Bold" FontSize="20"/>
<Button x:Name="installButton" Content="install"
HorizontalAlignment="Left" Margin="0,10" Padding="10,5"
Click="installButton_Click"/>
<Button x:Name="updateButton" Content="check for update"
HorizontalAlignment="Left" Margin="0,10" Padding="10,5"
Click="updateButton_Click"/>
<StackPanel Orientation="Horizontal">
<TextBlock Text="ShortName = " FontWeight="Bold"/>
<TextBlock Text="{Binding ShortName}"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Blurb = " FontWeight="Bold"/>
<TextBlock Text="{Binding Blurb}"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="WindowSettings.Title = " FontWeight="Bold"/>
<TextBlock Text="{Binding WindowSettings.Title}"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="WindowSettings.Height = " FontWeight="Bold"/>
<TextBlock Text="{Binding WindowSettings.Height}"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="WindowSettings.Width = " FontWeight="Bold"/>
<TextBlock Text="{Binding WindowSettings.Width}"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="IsRunningOutOfBrowser = " FontWeight="Bold"/>
<TextBlock x:Name="isRunningOutOfBrowserTextBlock"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="InstallState = " FontWeight="Bold"/>
<TextBlock x:Name="installStateTextBlock"/>
</StackPanel>
</StackPanel>
</UserControl>
Imports System
Imports System.Net.NetworkInformation
Imports System.Windows
Imports System.Windows.Controls
modo que requieran confianza elevada. Despus de la instalacin, estas aplicaciones de confianza pueden
omitir algunas de las restricciones del espacio aislado de seguridad. Por ejemplo, las aplicaciones de
confianza pueden obtener acceso a los archivos de usuario y utilizar el modo de pantalla completa sin
restricciones de teclado.
Se puede utilizar el diseador de proyectos de Visual Studio para configurar una aplicacin de modo que
requiera confianza elevada. El diseador establece el valor apropiado en el manifiesto de aplicacin.
Asimismo, es posible actualizar el manifiesto de una aplicacin existente sin recompilar. Sin embargo,
normalmente hay que modificar su funcionalidad para poder aprovechar la confianza elevada.
Cuando se instala una aplicacin de ejecucin fuera del explorador que requiere confianza elevada, aparece
una advertencia de seguridad en lugar del cuadro de dilogo de instalacin predeterminado. Esta
advertencia indica que la aplicacin puede obtener acceso a los datos del usuario y que debe instalarse
nicamente desde un sitio web de confianza. Una vez instalada, la aplicacin se comporta como una
aplicacin de ejecucin fuera del explorador normal, con la excepcin de lo descrito en este tema.
La advertencia de seguridad vara dependiendo de si la aplicacin tiene una firma digital vlida. Las
aplicaciones sin firmas vlidas (tambin denominadas aplicaciones no comprobadas) presentan un mayor
riesgo para la seguridad, por lo que la advertencia destaca ms. En las siguientes imgenes, se muestra la
advertencia de seguridad para una aplicacin antes y despus de que se agregue una firma digital.
Advertencia de seguridad para una aplicacin no comprobada
La mayora de la documentacin de Silverlight se ha escrito suponiendo que todas las aplicaciones son
aplicaciones en espacio aislado que se hospedan en un explorador. En este tema, se describe en qu se
diferencian las aplicaciones de confianza de las aplicaciones en espacio aislado. En concreto, se describen
las capacidades habilitadas por la confianza elevada y se explica cmo determinar si una aplicacin se
ejecuta con confianza elevada.
Nota:
Si bien las aplicaciones de confianza se ejecutan con privilegios de seguridad elevados, no tienen las mismas
capacidades que las aplicaciones de escritorio que se ejecutan con plena confianza. Esto ayuda a mantener
la compatibilidad con varias plataformas. Si se necesita un acceso no restringido al equipo del usuario, o se
precisan otras capacidades adems de las proporcionadas por Silverlight, puede ser conveniente utilizar
Windows Presentation Foundation (WPF). Como alternativa, se puede hospedar el complemento Silverlight
Para reemplazar la funcionalidad proporcionada por la barra de ttulo y el borde, puede utilizar las API de la
clase Window. Para que los usuarios puedan arrastrar la ventana o los bordes de la ventana, utilice los
mtodos DragResize y DragMove. Tambin puede ajustar el tamao y la posicin de la ventana mediante
las propiedades Left, Top, Width y Height. Para que los usuarios puedan minimizar y maximizar la ventana,
utilice la propiedad WindowState. Para que los usuarios puedan cerrar la ventana, utilice el mtodo Close.
Nota:
Estas carpetas son distintas de las bibliotecas de Windows 7 denominadas Documentos, Msica, Imgenes y
Vdeos. Estas carpetas de biblioteca suelen combinar el contenido de las carpetas del usuario con el de otras
carpetas, como carpetas multimedia compartidas. Sin embargo, las aplicaciones de confianza no pueden
obtener acceso a carpetas que no sean del usuario, salvo a travs de las clases SaveFileDialog y
OpenFileDialog.
Es preciso utilizar el mtodo Environment.GetFolderPath para obtener las rutas de acceso a las carpetas del
usuario. No se pueden especificar directamente estas rutas de acceso.
En la siguiente tabla, se muestran las clases del espacio de nombres System.IO que las aplicaciones de
confianza pueden utilizar. Tambin se indica qu miembros de cada clase no se admiten.
Integracin nativa
Las aplicaciones de confianza pueden obtener acceso a algunas de las capacidades del sistema operativo
nativo. Por ejemplo, en Windows, las aplicaciones de confianza pueden utilizar las caractersticas de
automatizacin y obtener acceso o manipular los componentes expuestos por el conjunto de Office y otras
aplicaciones.
Consideraciones de seguridad
Si bien las aplicaciones de confianza no tienen acceso total al equipo host, pueden obtener acceso a los
datos personales y causar daos. Por consiguiente, se han de tratarlas como aplicaciones de plena confianza
a la hora de realizar evaluaciones de seguridad y auditoras. Para evitar que los usuarios instalen o ejecuten
aplicaciones de confianza, los administradores del sistema pueden utilizar los valores de la directiva de
equipo para denegar el acceso, tal y como se describe en la seccin "Restricciones de directiva para la
confianza elevada" que figura en este tema.
Las aplicaciones de confianza se ejecutan con privilegios de usuario, incluso si las instalan usuarios con
privilegios de administrador. Sin embargo, las aplicaciones de confianza se pueden ejecutar con privilegios
elevados durante la depuracin en la fase de desarrollo, por lo que es necesario asegurarse de que las
pruebas se realicen en consecuencia.
Silverlight ejecuta todo el cdigo de aplicacin en una instancia de AppDomain que tiene un conjunto
uniforme de privilegios (aplicaciones de confianza o en espacio aislado). Es responsabilidad de los
desarrolladores de una aplicacin comprobar y validar cualquier componente externo que se agregue a la
aplicacin.
Las aplicaciones de ejecucin fuera del explorador son tan seguras como los sitios web donde se hospedan.
Por consiguiente, los usuarios deben basarse en la seguridad del sitio host al instalar o actualizar una
aplicacin de ejecucin fuera del explorador. En la siguiente lista, se describen algunas de las acciones que
se pueden realizar para ayudar a mejorar la seguridad.
Firme las aplicaciones tal y como se describe en la seccin "Firma de aplicaciones" que figura en
este tema.
Si la aplicacin obtiene acceso a recursos de su servidor host, deber comprobar que el valor de la
propiedad SilverlightHost.Source se corresponde con el identificador URI del sitio de origen
esperado.
Si la aplicacin trata informacin confidencial o carga cdigo adicional del servidor, se debe usar
HTTPS para el identificador URI de la aplicacin y para las comunicaciones seguras. Observe que
siempre se utiliza el identificador URI (incluido el protocolo) de la aplicacin original cuando se
comprueba si hay actualizaciones.
Las aplicaciones de ejecucin fuera del explorador pueden tener acceso a los recursos de la red por
HTTPS cuando hay una conexin disponible. Los certificados expirados o no vlidos darn lugar a
errores en las llamadas de conexin de red. Sin embargo, hoy en da, no hay ningn indicador
integrado de la presencia de un canal seguro. Para aumentar la confianza del usuario, considere la
posibilidad de proporcionar un indicador propio.
Firma de aplicaciones
Agregar una firma digital a una aplicacin de confianza es un paso importante para ayudar a proteger la
aplicacin y aumentar la confianza del usuario durante la instalacin. Adems, solamente las aplicaciones de
confianza con firmas digitales vlidas pueden utilizar el mecanismo de actualizacin de ejecucin fuera del
explorador. Para actualizar una aplicacin de confianza sin firma vlida, los usuarios deben desinstalar la
versin anterior e instalar manualmente la nueva versin.
Para agregar una firma digital a una aplicacin de confianza, utilice la utilidad SignTool.exe con un
certificado de firma de cdigo Authenicode X.509. Por ejemplo, puede utilizar la siguiente lnea de
comandos: signtool sign /v /f archivoDeCertificado.pfx archivoQueSeVaAFirmar
La firma de cdigo es relevante nicamente para las aplicaciones de confianza. Silverlight comprueba la
firma y el certificado cuando el usuario instala o actualiza la aplicacin. Una aplicacin de confianza se
puede instalar sin firma vlida. Sin embargo, Silverlight evita que las aplicaciones de confianza se actualicen,
a menos que la aplicacin original y la actualizacin estn firmadas con el mismo certificado de firma de
cdigo vlido y comprobado. Adems, el certificado no puede haber expirado en el momento de la
actualizacin. Asegrese de tener en cuenta la fecha de expiracin del certificado a la hora de planear la
implementacin y la actualizacin.
Nota:
Silverlight no evita las actualizaciones de la aplicacin cuando el host del sitio de origen es localhost o
127.0.0.1. Esto permite probar el cdigo de actualizacin sin firma digital.
Notas de la versin
Silverlight 3 no admite aplicaciones de confianza.
Nota:
Estas carpetas son distintas de las bibliotecas de Windows 7 denominadas Documentos, Msica, Imgenes y
Vdeos. Estas carpetas de biblioteca suelen combinar el contenido de las carpetas del usuario con el de otras
carpetas, como carpetas multimedia compartidas. Sin embargo, las aplicaciones de confianza no pueden
obtener acceso a carpetas que no sean del usuario, salvo a travs de las clases SaveFileDialog y
OpenFileDialog.
En el tema siguiente se muestra cmo tener acceso a archivos de las carpetas de usuario y se enumeran las
API expuestas para su uso en aplicaciones de confianza.
Nota:
Las aplicaciones de confianza no se admiten en Silverlight 3.
Procedimientos
Para tener acceso a archivos de carpetas de usuario
Use las API compatibles como hara en el marco de escritorio, pero emplee los valores indicados
previamente de la enumeracin System.Environment.SpecialFolder para construir las rutas de
acceso. En el ejemplo siguiente se muestra el uso necesario.
Private Sub TestIO()
If (Application.Current.HasElevatedPermissions) Then
Dim myDocuments As String = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
Dim filename As String = "test.txt"
Dim path As String = System.IO.Path.Combine(myDocuments, filename)
If File.Exists(path) Then
Dim contents As String = File.ReadAllText(path)
MessageBox.Show(contents)
End If
End If
End Sub
La automatizacin es una tecnologa que las aplicaciones emplean para exponer funcionalidad a las
herramientas de scripting y otras aplicaciones. Por ejemplo, puede usar Automatizacin para agregar
caractersticas de Office a sus aplicaciones basadas en Silverlight.
Una aplicacin o un componente que expone API de Automatizacin se denomina un servidor de
automatizacin, mientras que una aplicacin que tiene acceso a estas API se denomina un cliente de
automatizacin. En el tema siguiente se describe cmo permitir que las aplicaciones basadas en Silverlight
funcionen como clientes de automatizacin.
Nota:
Solo las aplicaciones de confianza con ejecucin fuera del explorador que se ejecutan en Windows pueden
tener acceso a las API de Automatizacin, y solo las expuestas por componentes o aplicaciones que ya estn
instalados.
Nota:
No se admiten eventos con valores devueltos.
Private Sub SearchEmail()
UpdateStatusMessage("Searching Inbox for 'Silverlight'...")
' The following code demonstrates three ways to handle Automation
' events. In Visual Basic, all three ways use the AutomationEvent class.
searchEvent = AutomationFactory.GetEvent(outlook, "AdvancedSearchComplete")
' The first way is demonstrated by the Handles clause of the
' SearchEvent_EventRaised method, which requires the WithEvents modifier
' on the searchEvent variable declaration.
' The second way uses the AddHandler syntax with the EventRaised event,
' and does not require the WithEvents modifier.
' AddHandler searchEvent.EventRaised, AddressOf SearchEvent_EventRaised
' The third way uses the AutomationEvent.AddEventHandler method, and
' requires the use of a delegate with an API signature that matches the Automation event.
' searchEvent.AddEventHandler(New AdvancedSearchCompleteDelegate(AddressOf SearchComplete))
' Begin the search.
outlook.AdvancedSearch("Inbox","urn:schemas:mailheader:subject ci_phrasematch 'Silverlight'",
True, "SubjectSearch")
End Sub
' Required only with the second two ways of handling Automation events.
' Private Delegate Sub AdvancedSearchCompleteDelegate(ByRef search As Object)
' Note: Visual Basic does not support the use of custom delegates for events with optional parameters.
Private Sub SearchComplete(ByRef search As Object)
Dim searchResults As New List(Of String)
For Each result As Object In search.Results
searchResults.Add(result.Subject)
Next
SetResultsList(searchResults)
End Sub
Ejemplo
El siguiente cdigo proporciona los mtodos auxiliares y el XAML de la interfaz de usuario que se usan en el
cdigo anterior. Para ejecutar el cdigo de este tema, cree un nuevo proyecto de aplicacin de Silverlight y,
a continuacin, agregue todo el cdigo a la clase MainPage.
<Grid x:Name="LayoutRoot" Background="White">
<TextBlock x:Name="message"/>
<ListBox x:Name="items" Visibility="Collapsed"/>
</Grid>
Nota:
Silverlight est supeditado a las mismas restricciones de recinto de seguridad con independencia del
entorno de host y de la presencia de un explorador web. Sin embargo, el entorno de host podra
proporcionar acceso total al equipo local, con lo que, en la prctica, se estara eludiendo la seguridad de
Silverlight.
Si no hay un explorador o conexin de red presente, el entorno de host podra tener que proporcionar
funcionalidades de reemplazo, segn sus requisitos.
de la pgina HTML o toda la pgina HTML. Debido a esto, existen dos marcos de referencia al colocar
objetos de Silverlight:
Dentro del complemento: los objetos se colocan en la superficie de Silverlight dentro del cuadro
de lmite del complemento. En la mayora de los artculos de informacin general sobre el diseo se
describe este tipo de colocacin.
Dentro del HTML: el complemento completo y todos los objetos colocados en su interior estn
sujetos al lugar donde se coloca el complemento en HTML.
Sistema de diseo
El trmino diseo describe el proceso de ajuste de tamao y colocacin de los objetos en la aplicacin
basada en Silverlight. Para colocar objetos visuales, se deben insertar en un objeto Panel u otro objeto
contenedor. El objeto Panel primario presenta un comportamiento de diseo definido que determina cmo
se dibujan en pantalla los miembros de la coleccin Children de un elemento Panel. Se trata de un proceso
intensivo y, cuanto mayor es la coleccin Children, mayor es el nmero de clculos realizados. Tambin se
puede incluir mayor complejidad segn el comportamiento de diseo definido por el elemento Panel que
posee la coleccin. Un diseo relativamente sencillo, como Canvas, puede producir un rendimiento
excelente si no se requiere un Panel ms complejo, como Grid.
Cada vez que un elemento UIElement secundario cambia de posicin, tiene el potencial de desencadenar un
nuevo paso del sistema de diseo. Es importante entender los eventos que pueden invocar el sistema de
diseo, ya que la invocacin innecesaria puede deteriorar el rendimiento de la aplicacin.
En su versin ms simple, el diseo es un sistema recursivo que conduce a la configuracin del tamao,
posicin y representacin de un elemento en la pantalla. El sistema de diseo completa dos pasos por cada
miembro de la coleccin Children: un paso de medida y un paso de organizacin. En el paso de medida se
determina el tamao deseado de cada elemento secundario. En el paso de organizacin se establece el
tamao y la posicin definitivos del elemento secundario.
Nota:
Al hacer referencia al diseo de un elemento, es ms exacto hacer referencia al diseo del cuadro de lmite
de ese elemento.
Para invalidar el comportamiento de diseo predeterminado de Panel, cada tipo de Panel proporciona sus
propios mtodos MeasureOverride y ArrangeOverride para lograr su propio comportamiento de diseo.
Esta es la serie de eventos que se produce cada vez que se invoca el sistema de diseo:
1. Se mide cada elemento UIElement secundario.
2. Se evalan las propiedades de tamao definidas en FrameworkElement, como Width, Height y
Margin.
3. Se aplica la lgica especfica de Panel, como la propiedad Orientation del apilamiento.
4. El contenido se organiza despus de medir todos los elementos secundarios.
5. Se dibuja la coleccin Children en la pantalla.
6. Se invoca el proceso de nuevo si se agregan propiedades Children adicionales a la coleccin,
cambian las propiedades de diseo de Children, como Width y Height, o se llama al mtodo
UpdateLayout.
Este proceso y los medios por los que se invoca se definen con mayor detalle en las secciones siguientes.
margen y el relleno, y el comportamiento individual del elemento Panel primario. A partir de estos datos, el
sistema puede calcular la posicin de todos los elementos secundarios de un Panel determinado. Es
importante recordar que las caractersticas de tamao definidas en el elemento primario (como un Border)
afectan a sus elementos secundarios.
En la siguiente ilustracin se muestran las dimensiones de un panel primario, su elemento secundario y la
ranura de diseo que contiene el elemento secundario.
Puede ver que el rea asignada para el elemento secundario es, en realidad, mucho mayor que el elemento
secundario. Corresponde al contenedor primario determinar el tamao de la ranura de diseo para cada
elemento secundario. El elemento primario puede asignar ms o menos espacio del que solicita el elemento
secundario. Puede obtener las dimensiones de la ranura de diseo llamando a GetLayoutSlot. A
continuacin, el elemento primario coloca el elemento secundario dentro de su ranura de diseo en funcin
de las propiedades de alineacin establecidas para el elemento secundario.
En la ilustracin siguiente se muestra un elemento secundario que se gira y se extiende ms all de su
ranura de diseo asignada.
En este caso, el sistema de diseo recorta el elemento secundario y solo muestra la parte que cabe en la
ranura de diseo. Esta rea visible, perfilada en rojo, se denomina clip de diseo y sus dimensiones se
pueden obtener llamando al mtodo GetLayoutClip. Tenga en cuenta que GetLayoutClip devuelve un objeto
Geometry, por lo que el rea visible no es necesariamente un rectngulo.
El cuadro de lmite que rodea un elemento puede cambiar a medida que se agregan elementos adicionales
al contenedor primario. Puede reducirse o expandirse, en funcin del tipo y del tamao de los elementos
que se agregan.
elemento secundario, pero el elemento primario tambin puede optar por restringir el tamao del elemento
secundario en funcin del nmero de elementos que necesite colocar y el valor de su parmetro
availableSize.
Nota:
Existe una diferencia entre las propiedades de Height y Width, y ActualHeight y ActualWidth. Por ejemplo, la
propiedad ActualHeight es un valor calculado que se basa en otras entradas de alto y en el sistema de
diseo. El propio sistema de diseo establece el valor, basndose en un paso de representacin real; por
consiguiente, puede existir un pequeo desfase con respecto al valor establecido de propiedades como
Height, que constituyen la base del cambio de entrada. Es necesario establecer Height y Width puesto que
su valor predeterminado es 0.
Dado que ActualHeight es un valor calculado, debe tener en cuenta que puede sufrir varios cambios o
cambios incrementales como resultado de las diversas operaciones realizadas por el sistema de diseo. El
sistema de diseo puede calcular el espacio de medidas necesario para los elementos secundarios, las
restricciones impuestas por el elemento principal, etc.
El objetivo final del paso de medida es que el sistema de diseo determine el valor de la propiedad
DesiredSize de cada elemento secundario, lo que sucede internamente despus de llamar a Measure. Este
valor se almacena y se utiliza durante el proceso de organizacin.
Organizar
En el paso de organizacin, el sistema de diseo indica al objeto Panel el valor de finalSize que est
disponible para l y sus elementos secundarios. Durante el paso de organizacin, el elemento Panel
primario evala la propiedad DesiredSize del elemento secundario y los mrgenes adicionales que puedan
afectar al tamao representado del elemento; a continuacin, determina el cuadro de lmite para cada
elemento secundario. El cuadro de lmite determina las dimensiones de la ranura de diseo del elemento
secundario. Luego, el elemento primario Panel llama al mtodo Arrange de cada elemento secundario,
pasando la estructura Rect que establece el punto de origen del elemento secundario en el panel as como
su alto y ancho.
Nota:
Todo el diseo es relativo al elemento primario. Si se establece el punto de origen en 0.0, el elemento
secundario se colocar en la esquina superior izquierda del panel primario y no en la esquina superior
izquierda del complemento Silverlight.
El sistema de diseo efecta una ltima evaluacin de las propiedades de desplazamiento, como los
mrgenes y la alineacin, y coloca el elemento secundario dentro de su ranura de diseo. El elemento
secundario no necesita rellenar el espacio asignado completo, y con frecuencia no lo hace. A continuacin,
el control se devuelve al Panel primario y el proceso del diseo se completa.
Nombre del
Descripcin
panel
Define un rea en la que pueden colocarse explcitamente los elementos secundarios
Canvas
utilizando las coordenadas relativas al rea del control Canvas.
Grid Define un rea de cuadrcula flexible que se compone de columnas y filas.
Organiza los elementos secundarios en una nica lnea que se puede orientar horizontal o
StackPanel
verticalmente.
Cada uno de estos contenedores de diseo tiene en cuenta distintas propiedades que pueden afectar al
modo en que se organizan los elementos secundarios. Algunos de los ms comunes se muestran en la tabla
siguiente.
Adems de aplicar la lgica de diseo de panel, puede utilizar transformaciones y animaciones para cambiar
la posicin de un objeto.
Para los escenarios que requieren un diseo de aplicacin que no es posible utilizando cualquiera de los
elementos Panel predefinidos, se pueden conseguir comportamientos de diseo personalizados heredando
de Panel e invalidando el comportamiento predeterminado de medida y organizacin mediante los
mtodos MeasureOverride y ArrangeOverride.
Requisitos previos
Antes de seguir los pasos en este tema, deber familiarizarse con el modo en que los objetos se
dimensionan y colocan en Silverlight.
Medir
El primer paso en el diseo de un panel es medir cada elemento secundario y determinar cunto espacio
asignar el panel a dicho elemento secundario. Adems, devuelva la cantidad de espacio disponible para el
panel completo.
En el ejemplo siguiente se muestra una invalidacin del mtodo MeasureOverride para un panel
(BlockPanel) que coloca 9 elementos secundarios en una cuadrcula de 3x3 donde cada celda es 100x100.
'First measure all children and return available size of panel
Protected Overloads Overrides Function MeasureOverride(ByVal availableSize As Size) As Size
'Measure first 9 children giving them space up to 100x100, remaining children get 0x0
Dim i As Integer = 0
For Each child As FrameworkElement In Children
If i < 9 Then
child.Measure(New Size(100, 100))
Else
child.Measure(New Size(0, 0))
En MeasureOverride, debe llamar al mtodo Measure de cada elemento secundario, pasando el espacio que
el panel puede asignar. A continuacin, el sistema del diseo calcula DesiredSize de cada elemento
secundario basndose en el tamao disponible. En este ejemplo, asignamos 100x100 a los primeros 9
elementos secundarios y 0x0 a los restantes. El tamao que el elemento primario asigna al elemento
secundario puede basarse en el valor availableSize que se pasa en el mtodo MeasureOverride. El valor de
availableSize representa el rea que el panel puede ocupar en el diseo.
Cuando se llama a Measure, el sistema del diseo determina el DesiredSize del elemento secundario
basndose en availableSize pasado a Measure y el tamao natural del elemento. El tamao natural lo
determina el elemento Width y las propiedades Height o el tamao nativo de una imagen. La propiedad
DesiredSize se establece generalmente en availableSize o en el tamao natural, el que tenga menor valor.
Una vez establecido DesiredSize de los elementos secundarios, el panel debe determinar cunto espacio
solicitar de su elemento primario como el valor devuelto de su invalidacin de MeasureOverride. El valor
adecuado se puede determinar de varias maneras:
Se calcula dependiendo de los valores DesiredSize totales de todos los elementos secundarios.
Un tamao predeterminado, como el ejemplo actual.
Un tamao muy grande, que permitir exceso de espacio para que el panel organice los elementos
secundarios.
Precaucin:
No devuelva el valor availableSize que se pas a MeasureOverride. El valor devuelto para Measure Override
debe ser finito, pero el availableSize que se pasa puede ser infinito en algunos casos.
Organizar
Una vez completado el paso Medir, comienza el paso Organizar. En este paso debe determinar la posicin y
el tamao de la ranura de diseo de cada elemento secundario, y establecer el tamao final del panel.
En el cdigo siguiente se muestra el mtodo ArrangeOverride para el BlockPanel de la seccin Measuring.
'Second arrange all children and return final size of panel
Protected Overloads Overrides Function ArrangeOverride(ByVal finalSize As Size) As Size
'Get the collection of children
Dim mychildren As UIElementCollection = Children
'Get total number of children
Dim count As Integer = mychildren.Count
'Arrange children We're only allowing 9 children in this panel. More children will get a 0x0 layout slot.
Dim i As Integer
For i = 0 To 8
'Get (left, top) origin point for the element in the 3x3 block
Dim cellOrigin As Point = GetOrigin(i, 3, New Size(100, 100))
'Arrange child Get desired height and width. This will not be larger than 100x100 as set in MeasureOverride.
Dim dw As Double = mychildren(i).DesiredSize.Width
Dim dh As Double = mychildren(i).DesiredSize.Height
mychildren(i).Arrange(New Rect(cellOrigin.X, cellOrigin.Y, dw, dh))
Next
For i = 9 To count - 1
'Give the remaining children a 0x0 layout slot
mychildren(i).Arrange(New Rect(0, 0, 0, 0))
Next
'Return final size of the panel
Return New Size(300, 300)
End Function
En ArrangeOverride, llame a Arrange en cada secundario, pasando un Rect. Esto establece el punto de
origen, el alto y el ancho de la ranura de diseo del elemento secundario en el panel primario. En este
ejemplo, los primeros 9 elementos secundarios se colocan en una celda de una cuadrcula de 3x3 basndose
en su orden en la coleccin Children. El primer elemento secundario se coloca en la celda superior izquierda,
de modo que el objeto Rect pasado es (0,0,100,100); esto significa que se colocar en la esquina superior
izquierda del panel y que tendr un ancho y un alto de 100. Los 9 primeros elementos secundarios tienen
asignada una ranura de diseo de 100 x 100. La ranura de diseo asignada a los dems elementos
secundarios es de 0 x 0. Si el tamao deseado del elemento secundario es mayor que el espacio asignado,
se recortar. Cada elemento secundario se coloca en la ranura del diseo segn las dems propiedades de
diseo, como HorizontalAlignment, VerticalAlignment y Margin.
Nota:
El panel personalizado no debera tener en cuenta propiedades que se pueden establecer, como Visibility,
Margin o MinWidth, cuando se determina el diseo. El sistema de diseo de Silverlight administrar todas
estas propiedades. As que, por ejemplo, no es necesario que omita el diseo para elementos con Visibility
de Collapsed porque el sistema de diseo lo controlar.
Una vez organizados los elementos secundario, devuelva el tamao final del panel. Este es el tamao que el
panel solicitar de su contenedor primario. En este ejemplo, BlockPanel se establece siempre en 300x300.
aplicacin. Tambin tiene implicaciones con respecto al modo en que el usuario podra establecer los
valores de las propiedades o usar los valores existentes de las propiedades de diseo si ejecuta su propia
lgica de diseo en un panel personalizado o en otra clase.
La propiedad UseLayoutRounding
La superficie de API directa para el comportamiento de redondeo del diseo es la propiedad nica
UIElement.UseLayoutRounding. El valor predeterminado de esta propiedad es true, lo que significa que el
redondeo del diseo est activado de forma predeterminada.
Nota:
Establecer con valores Double las propiedades de ajuste de tamao de Silverlight es una tcnica que se usa
principalmente con fines de compatibilidad con WPF. WPF admite un comportamiento de conversin para
otros tipos unitarios y tambin admite un concepto de pxel independiente del dispositivo que incluye
dependencias de plataforma. Silverlight es multiplataforma y no admite los tipos unitarios; por lo tanto, los
requisitos de conversin de WPF que requieren un tipo Double subyacente no suelen ser relevantes para la
programacin en Silverlight.
la lgica de clase. Por ejemplo, podra estar agregando o calculando los valores, y preferir valores exactos a
arriesgarse a perder informacin en el proceso de redondeo.
Nota:
UseLayoutRounding existe en UIElement porque generalmente controla el comportamiento de las clases de
los contenedores de diseo, como los paneles, pero hay contenedores de diseo que potencialmente no
son paneles (FrameworkElement podra implementar ArrangeOverride y el resto de las API de diseo).
Lneas de ajuste
Las guas de alineacin representan una indicacin visual que ayuda a alinear un control con respecto a los
otros controles de una aplicacin. Cuando se arrastra un control en Silverlight Designer, las guas de
alineacin aparecen al alinearse el control con otro control. Las lneas de ajuste aparecen como lneas rojas
que conectan el control que se est arrastrando con el control con el que se est alineado. Las guas de
alineacin aparecen cuando el borde superior, inferior, izquierdo o derecho del control que se est
arrastrando se alinea con el correspondiente borde de otro control. Con algunos controles, las lneas de
ajuste aparecen tambin cuando las lneas base del texto estn alineadas.
Para alinear los bordes de los controles
En Silverlight Designer, con al menos dos controles, arrastre o cambie el tamao de uno de ellos
para que el borde se alinee con otro control.
Cuando los bordes estn alineados, aparecer una lnea de ajuste indicando la alineacin. Cuando
las lneas de ajuste aparecen, tambin ver un nmero junto a la lnea de ajuste que cambia a
medida que arrastra el control. El nmero indica la distancia entre el borde del control actual y el
borde del otro control.
Para alinear lneas base del texto de controles basados en texto
En Silverlight Designer, con al menos dos controles basados en texto, arrastre uno de ellos de
modo que la lnea base del texto se alinee con la lnea base del texto de otro control.
Cuando las lneas base del texto estn alineadas, aparecer una lnea de ajuste indicando la
alineacin.
Para desactivar las lneas de ajuste
Mientras arrastra un control en Silverlight Designer, mantenga presionada la tecla ALT.
Las lneas de ajuste se deshabilitarn temporalmente y ya no aparecern.
Mrgenes
En Silverlight Designer, el trmino margen hace referencia a la cantidad de espacio que hay entre el borde
de un control y el borde de su contenedor host. Cuando se selecciona un control en Silverlight Designer, los
mrgenes se indican mediante las lneas negras que aparecen entre los bordes del control y los bordes del
contenedor. Si aparece una lnea de margen entre un control y el borde de la aplicacin, eso indica que el
margen es fijo. Cuando cambia el tamao del explorador, la distancia entre ese borde del control y ese
borde de la aplicacin se mantiene constante. En cambio, si se muestra una lnea como un margen variable
que no se ajusta al borde de la aplicacin, esto indica que el margen no es fijo y que la distancia entre ese
borde del control y ese borde de la aplicacin puede cambiar. Por ejemplo, si los mrgenes izquierdo y
superior de un control son fijos, el control mantendr su posicin con respecto a la esquina superior
izquierda de la aplicacin cuando cambie el tamao del explorador. Por otro lado, si los mrgenes inferior y
derecho son fijos, el control cambiar de posicin con respecto a la esquina superior izquierda de la
aplicacin cuando cambie el tamao del explorador. Si los mrgenes contrarios, por ejemplo, el margen
inferior y el margen superior, son fijos, el control se ajustar cuando cambie el tamao del explorador.
Para fijar o liberar los mrgenes de un control
1. En Silverlight Designer, arrastre un control hasta la ubicacin que desee.
Observe que en cada lado del control hay lneas o cdigos auxiliares. Las lneas se ajustan desde el
borde del control al borde correspondiente del contenedor.
2. Para fijar un margen, muvase sobre un cdigo auxiliar hasta que el puntero se convierta en un
dedo sealador.
3. Haga clic en el cdigo auxiliar. El cdigo auxiliar se expande para formar una lnea de margen y se
fija el margen.
4. Para liberar un margen, muvase sobre una lnea hasta que el puntero se convierta en un dedo
sealador.
5. Haga clic en la lnea del margen. La lnea se contrae en un cdigo auxiliar y el margen de ese lado
se libera.
Lneas de la cuadrcula
Las lneas de la cuadrcula se pueden utilizar para alinear los controles de Silverlight Designer que se han
diseado mediante el control contenedor Grid. Las lneas de la cuadrcula representan las divisiones entre
las filas y columnas de un Grid. Cuando los controles se colocan dentro de una fila, columna o celda de Grid,
los mrgenes mostrados son relativos a los bordes de la fila, columna o celda, y las lneas de ajuste de Grid,
se pueden utilizar para alinear el control a los lados de la fila o columna.
Cuando se selecciona un control Grid en Silverlight Designer, aparecen carriles en los lados superior e
izquierdo. Puede utilizar los rales para agregar, quitar o cambiar el tamao de las filas y columnas de la
cuadrcula.
Nota:
Si la propiedad FlowDirection est establecida en RighToLeft, el ral de las filas aparece en el lado derecho
de Grid.
Nota:
Si la fila no tiene contenido, el ajuste de tamao automtico hace que se contraiga a un alto de
tamao cero. Esto puede provocar dificultades a medida que sigue diseando el objeto Grid. Para
evitar este problema, agregue contenido a la fila antes de establecer el ajuste de tamao
automtico. Tambin podr usar la variacin de tamao proporcional mientras trabaje y cambiar a
Automtico cuando termine.
8. Para salir sin seleccionar una opcin de tamao, presione ESC o mueva el puntero fuera de la barra
de tamao.
Para establecer el ancho de una columna mediante el diseador, siga los pasos anteriores pero mueva el
puntero sobre el ral superior para activar la barra de tamao.
Una aplicacin basada en Silverlight entra en modo de pantalla completa cuando se establece la propiedad
IsFullScreen en true. En el momento de entrar en modo de pantalla completa, la aplicacin muestra durante
unos instantes el mensaje "Presione ESC para salir del modo de pantalla completa". Este mensaje avisa al
usuario de que la aplicacin est en modo de pantalla completa, y proporciona informacin sobre cmo
volver al modo incrustado.
Mensaje del modo de pantalla completa
En el ejemplo de cdigo siguiente, se muestra cmo habilitar y deshabilitar el modo de pantalla completa
alternando el valor de la propiedad IsFullScreen.
Private WithEvents rootPage As Page = New Page()
Private WithEvents htmlContent As Content
Private Sub Application_Startup(ByVal o As Object, ByVal e As StartupEventArgs) Handles Me.Startup
Me.RootVisual = rootPage
htmlContent = Me.Host.Content
End Sub
Nota:
La iniciacin por parte del usuario y los dems requisitos no se aplican a las aplicaciones de confianza. Para
obtener ms informacin, vea la siguiente seccin.
De forma predeterminada, solamente puede haber una aplicacin a la vez en modo de pantalla completa.
Normalmente, una aplicacin sale del modo de pantalla completa cuando el usuario pasa a otra aplicacin.
Para configurar una aplicacin basada en Silverlight de modo que permanezca en modo de pantalla
completa independientemente de si est activa o no, establezca la propiedad FullScreenOptions en
StaysFullScreenWhenUnfocused. De este modo, los usuarios podrn ver una aplicacin en modo de pantalla
completa mientras interactan con otras aplicaciones. Asimismo, podrn mostrar varias aplicaciones en
modo de pantalla completa.
Cuando una aplicacin permanece en modo de pantalla completa mientras est inactiva, los usuarios
pueden cambiar a otras aplicaciones. Entre ellas se encuentra el explorador del host original o la ventana de
ejecucin fuera del explorador, donde el complemento Silverlight incrustado mostrar un rea vaca
mientras la aplicacin est en modo de pantalla completa.
En la mayora de los casos, al pasar de nuevo a una aplicacin en modo de pantalla completa, no se vuelve a
mostrar el mensaje referente al modo de pantalla completa. Esto significa que las aplicaciones
malintencionadas tienen una oportunidad ms para suplantar la identidad de otras aplicaciones. Para
intentar evitarlo, el valor StaysFullScreenWhenUnfocused hace que la aplicacin muestre un cuadro de
dilogo para el consentimiento del usuario antes de entrar en modo de pantalla completa. Si el usuario no
da su consentimiento, la aplicacin utilizaa el comportamiento predeterminado del modo de pantalla
completa.
Este cuadro de dilogo incluye una casilla que permite a los usuarios guardar sus preferencias. Los usuarios
pueden modificar sus preferencias en Configuracin de Microsoft Silverlight (Cuadro de dilogo).
Cuando una aplicacin basada en Silverlight est en modo de pantalla completa, la mayora de los eventos
de teclado estn deshabilitados. Esta limitacin de las acciones del teclado durante el modo de pantalla
completa es una caracterstica de seguridad, dirigida a minimizar la posibilidad de que el usuario escriba
informacin imprevista. En modo de pantalla completa, las nicas entradas permitidas son las
correspondientes a las siguientes teclas:
FLECHA ARRIBA
FLECHA ABAJO
FLECHA IZQUIERDA
FLECHA DERECHA
BARRA ESPACIADORA
TAB
RE PG
AV PG
INICIO
FIN
ENTRAR
Silverlight no admite cuadros de dilogo en modo de pantalla completa. Esto incluye las clases
SaveFileDialog y OpenFileDialog, adems de los cuadros de dilogo para el consentimiento del usuario. En
la mayora de los casos, si se muestra un cuadro de dilogo en modo de pantalla completa, la aplicacin se
revertir al modo incrustado. Sin embargo, para evitar problemas en algunos exploradores, se debe salir del
modo de pantalla completa antes de utilizar una caracterstica que muestra un cuadro de dilogo.
El modo de pantalla completa no admite operaciones de arrastrar y colocar ni entradas multitoque. Si una
aplicacin utiliza estas caractersticas, se debe proporcionar al usuario informacin sobre las alternativas que
puede usar cuando la aplicacin entra en modo de pantalla completa.
Modo de pantalla completa con aplicaciones de confianza
El mensaje referente al modo de pantalla completa, el requisito de la iniciacin por parte del usuario, las
restricciones de teclado y de cuadro de dilogo no se aplican a las aplicaciones de confianza. Adems, las
aplicaciones de confianza no muestran el cuadro de dilogo para el consentimiento del usuario cuando
usan el valor StaysFullScreenWhenUnfocused.
Dado que la tecla ESC no tiene ningn efecto integrado para las aplicaciones de confianza, se puede
utilizarla para fines propios. Para ello, sin embargo, es necesario implementar una alternativa para que los
usuarios puedan salir del modo de pantalla completa.
Tamao de la aplicacin en modo de pantalla completa
Cuando una aplicacin basada en Silverlight est en modo de pantalla completa, su tamao equivale a la
resolucin actual de la pantalla. Sin embargo, los valores de las propiedades width y height del
complemento no se ven afectados al cambiar al modo de pantalla completa. Para determinar el tamao real
de la aplicacin en modo de pantalla completa, utilice las propiedades Content.ActualWidth y
Content.ActualHeight. En modo de pantalla completa, el valor de estas propiedades se establece en la
resolucin actual de la pantalla.
Cuando una aplicacin en modo de pantalla completa vuelve a pasar al modo incrustado, su tamao
cambia a los valores de las propiedades width y height.
Caractersticas de rendimiento durante un cambio de modo
Cambiar entre el modo incrustado y el modo de pantalla completa tiene un efecto mnimo sobre el
rendimiento del contenido de la aplicacin. En la mayora de los casos, esto significa que la reproduccin de
audio o vdeo se realiza sin problemas.
Nota:
Para obtener el mximo rendimiento, cuando la aplicacin pase al modo de pantalla completa, oculte o
desconecte del rbol visual todos los objetos que no se representen en ese modo. Puede ocultar un objeto
estableciendo su propiedad Visibility en Collapsed.
Evento FullScreenChanged
El evento Content.FullScreenChanged se produce siempre que cambia la propiedad IsFullScreen. Este evento
se puede controlar para cambiar la interfaz de usuario en modo de pantalla completa.
Nota:
El evento Resized no se produce cuando la aplicacin entra en modo de pantalla completa. Sin embargo,
normalmente este tipo de cambios de diseo se realizan en los controladores de los eventos
FullScreenChanged y Resized.
Notas de la versin
Silverlight 3 no admite las siguientes caractersticas que se han mencionado en este tema:
Propiedad FullScreenOptions.
Aplicaciones de confianza.
El control WebBrowser.
4.3. Entrada
En esta seccin se describe la compatibilidad de Silverlight con los datos proporcionados por el usuario.
Silverlight proporciona un conjunto de eventos que permiten responder a las acciones del mouse, como
mover el mouse o hacer clic con el mouse. Silverlight tambin puede promover las entradas de lpiz y las
entradas multitoque a acciones de mouse equivalentes.
Evento Descripcin
Se produce cuando el elemento de la interfaz de usuario pierde la captura del
LostMouseCapture
mouse.
Se produce cuando cambia la posicin de las coordenadas del puntero del mouse
MouseMove
(o del lpiz).
MouseEnter Se produce cuando el mouse (o lpiz) entra en el rea delimitadora de un objeto.
MouseLeave Se produce cuando el mouse (o lpiz) sale del rea delimitadora de un objeto.
Se produce cuando se presiona el botn primario del mouse o cuando la punta
MouseLeftButtonDown
del lpiz toca la pantalla.
Se produce cuando se suelta el botn primario del mouse o cuando la punta del
MouseLeftButtonUp lpiz deja de tocar la pantalla, normalmente a continuacin de un evento
MouseLeftButtonDown.
MouseRightButtonDown Se produce cuando se presiona el botn secundario del mouse.
MouseRightButtonUp Se produce cuando se suelta el botn secundario del mouse.
En este tema, no se explica cmo adjuntar un controlador de eventos del mouse mediante cdigo. La
tcnica para adjuntar controladores de eventos mediante cdigo suele ser la misma para todos los eventos
de Silverlight o eventos del mouse.
En el ejemplo siguiente se muestra cmo recuperar la posicin actual del puntero del mouse
correspondiente al objeto utilizando un desplazamiento relativo a otro objeto referenceObject del rbol.
Private Sub Rectangle_MouseLeftButtonDown(ByVal sender As Object, ByVal e As MouseButtonEventArgs)
' Return a Point object representing the x- and y-coordinates of the current mouse position
' relative to the reference object.
Dim pt As Point = e.GetPosition(referenceObject)
' Display the current mouse position on statusText, an existing textblock.
statusText.Text = pt.X & " : " & pt.Y
End Sub
Nota:
Si bien MouseLeave utiliza MouseEventArgs, no hay ninguna posicin de mouse significativa disponible a
travs de GetPosition para el evento MouseLeave.
La decisin de establecer o no la propiedad Handled en true representa una decisin consciente de detener
la ruta. El significado exacto de que un evento de entrada determinado est controlado ("Handled") sigue
estando en sus manos en el contexto de la aplicacin, pero su decisin de establecer o no Handled no tiene
ningn efecto tangible sobre el comportamiento de enrutamiento posterior de dicho evento de entrada en
concreto.
Eventos del mouse AddHandler y Already-Handled
Se puede utilizar una tcnica especial para adjuntar controladores que pueden actuar sobre eventos ya
marcados como controlados. En esta tcnica, se utiliza el mtodo AddHandler para registrar un controlador,
en lugar de usar atributos XAML o una sintaxis especfica del lenguaje para agregar un controlador, como
+= en C#. Esta tcnica tiene como limitacin que la API de AddHandler toma un parmetro de tipo
RoutedEvent que identifica el evento enrutado en cuestin. No todos los eventos enrutados de Silverlight
proporcionan un identificador de RoutedEvent, por lo que esta consideracin determina qu eventos
enrutados se podrn controlar en el caso de Handled. Los eventos del mouse MouseLeftButtonDown,
MouseLeftButtonUp y MouseWheel tienen identificadores de evento enrutado como campos en UIElement.
Los dems eventos del mouse (MouseEnter, MouseLeave, MouseMove, MouseRightButtonDown,
MouseRightButtonUp) no tienen identificadores de evento enrutado en Silverlight.
Eventos MouseEnter y MouseLeave
Los eventos MouseEnter y MouseLeave no se enrutan. Estos eventos los generan y los controlan nicamente
los elementos en los que entra o de los que sale el puntero del mouse. Este diseo de eventos es igual que
en WPF y tambin se basa en el modelo de diseo del DOM HTML de Internet Explorer.
Si desea que los elementos primarios sepan que los elementos secundarios han recibido eventos
MouseEnter y MouseLeave, deber configurarlo de modo que forme parte de su propia lgica de control o
de aplicacin. Para los autores de controles, reemplazar OnMouseEnter o OnMouseLeave puede resultar til
en este escenario.
LostMouseCapture es la ltima posicin conocida y puede ser que estos datos no sean tiles para una
accin de la interfaz de usuario.
Adems, no es un diseo robusto emparejar siempre una llamada a ReleaseMouseCapture al evento
MouseLeave en un elemento concreto de la interfaz de usuario que se va a usar como origen de captura. El
motivo es el siguiente: cuando LostMouseCapture notifica la ltima posicin conocida del mouse, se genera
un evento MouseEnter y, a continuacin, se generan otros eventos MouseEnter a medida que se mueve el
mouse. En lugar de llamar al mtodo ReleaseMouseCapture al producirse el evento MouseLeave, se ha de
escuchar el evento LostMouseCapture.
Eventos que se producen al hacer clic con el botn secundario del mouse
Los eventos que se producen al hacer clic con el botn secundario del mouse son nuevos en Silverlight 4.
Para capturar estos eventos, el cliente debe ejecutar una plataforma capaz, por su diseo de hardware y de
sistema operativo, de generar una accin de entrada de hacer clic con el botn secundario del mouse. Los
datos de evento MouseButtonEventArgs no contienen informacin sobre el botn en el que se ha hecho
clic. Es responsabilidad del controlador responder a los eventos apropiados que denotan un clic con el
botn primario con respecto a los que denotan un clic con el botn secundario. Los eventos de clic con el
botn secundario son eventos enrutados, son similares a los eventos de clic con el botn primario pero no
comparten los datos de evento para la determinacin de Handled ni se relacionan de ninguna otra manera
con las acciones de clic con el botn primario. Si el usuario presiona simultneamente ambos botones del
mouse, se generan dos eventos independientes.
Doble clic
Silverlight no proporciona ningn evento designado para el doble clic de un botn del mouse. Le
corresponde al cdigo de la aplicacin determinar si los eventos de los botones del mouse constituyen un
doble clic, si los dos clics se han producido en un mbito aceptable, etc. Normalmente, el cdigo de una
aplicacin usa un objeto Timer en el primer controlador del botn del mouse y, a continuacin, comprueba
el temporizador en la llamada al siguiente controlador.
Arrastrar y colocar
Arrastrar y colocar es un comportamiento relacionado con el mouse, pero no se aborda en este tema.
La aplicacin se implementa fuera del explorador, por lo que no hay ninguna pgina HTML de
hospedaje para controlar los eventos DOM.
El evento MouseWheel administrado admite estos dos casos. Por tanto, debe usar el evento MouseWheel
en lugar de eventos DOM siempre que sea posible. Esto es especialmente cierto si implementa o usa
controles con determinado control de eventos de rueda del mouse. El evento MouseWheel se enruta a
travs de otros objetos administrados de la interfaz de usuario de Silverlight, se puede cancelar con la
propiedad Handled, y se integra con las plantillas de control y el modelo de estados visuales en general.
Debido a las dependencias de la plataforma, es posible que todava desee usar el control del DOM HTML de
OnMouseWheel. Esto se describe con ms detalle en "Dependencias de la plataforma", ms adelante en
este tema.
Dependencias de la plataforma
El evento MouseWheel solo se genera y se puede controlar para las plataformas compatibles. Por ejemplo,
en Microsoft Windows, MouseWheel es compatible en Internet Explorer y Firefox, y en las aplicaciones con
ejecucin fuera del explorador. Cualquier cliente y host de explorador que use un sistema operativo
Macintosh no genera el evento. En la tabla siguiente se enumeran varias plataformas y si se admite
MouseWheel.
Para procesar informacin de rueda del mouse para los clientes o situaciones que no generan MouseWheel,
se debe usar el control de eventos del DOM HTML para los eventos mouseWheel (el atributo
onMouseWheel especifica un controlador) que estn disponibles en el scripting de cliente y el puente
HTML.
Hardware multitoque
El concepto de multitoque necesita dispositivos de hardware capaces de registrar la presin tctil que se
produce en una superficie. La superficie podra ser directamente la pantalla (como en un dispositivo Tablet
PC) o un dispositivo de entrada dedicado independiente (como una tableta grfica). De stos, el dispositivo
Tablet PC o dispositivos similares con sensibilidad tctil directamente en la pantalla son por lo general los
ms pertinentes para Silverlight.
Requisitos de plataforma
La entrada multitoque necesita un entorno (dispositivo; plataforma y sistema operativo; aplicacin host
como un explorador) que pueda difundir la entrada tctil a una aplicacin individual, como una aplicacin
basada en Silverlight.
Los dispositivos compatibles con la entrada multitoque son un mercado en evolucin y los dispositivos
concretos no se tratan en este tema.
Windows 7 admite la entrada multitoque en el nivel del sistema operativo. Esto se admite en parte a travs
de un mensaje (WM_TOUCH). En este nivel, el sistema operativo proporciona una promocin de mensajes
multitoque a mensajes del mouse. La promocin est presente de forma que los usuarios de entrada
multitoque puedan usar el toque y los gestos como sustitutos de movimientos del mouse o clics del mouse.
Esto es til al interactuar con aplicaciones que quizs no estn preparadas para el toque y la aplicacin
realiza todos sus procesamientos de entrada espacial a travs de eventos del mouse y mensajes. Windows 7
tambin combina los mensajes cuando es necesario, por lo que las aplicaciones no tienen que procesar una
gran cantidad de mensajes intermedios que generan eventos incrementales.
La versin 8 de Internet Explorer como un host de explorador tambin reconoce la entrada multitoque.
Internet Explorer versin 8 reenva los mensajes multitoque de plataforma a complementos como Silverlight
que se ejecutan dentro de Internet Explorer, por lo que las aplicaciones de Silverlight pueden interactuar
con la entrada multitoque.
Entrada multitoque para Silverlight (se muestra para el host IE8)
La entrada multitoque tambin se admite para Silverlight en las versiones actuales de hosts Firefox que se
ejecutan en Windows 7 y para las aplicaciones con ejecucin fuera del explorador que se ejecutan en
Windows 7. Sin embargo, la entrada multitoque no se admite para las aplicaciones que se ejecutan en modo
de pantalla completa.
Registro para la entrada multitoque
Como parte de la arquitectura de plataforma ms amplia para entradas multitoque, cada aplicacin que
desee recibir mensajes multitoque debe registrar su HWND (la API tctil para Windows 7 incluye
RegisterTouchWindow con esta finalidad). El runtime de Silverlight 4 se ocupa de este paso de registro, y
registra Silverlight como un runtime y todas las aplicaciones que usen Silverlight como runtime. Por lo tanto,
generalmente no es necesario interactuar de forma directa con el cdigo de plataforma para procesar la
entrada multitoque. Sin embargo, las caractersticas de interaccin multitoque dentro de la API tctil para la
entrada multitoque de Windows 7 y Silverlight 4 son bastante concretas:
Silverlight 4 se registra para la entrada tctil sin formato, no gestos. Si entre sus requisitos se
incluyen los movimientos, debe procesar la entrada tctil en movimientos utilizando su propio
cdigo de aplicacin, dentro del contexto de Silverlight. Alternativamente, puede necesitar un
diseo de interoperacin mayor para poder incluir un HWND independiente registrado para los
movimientos multitoque desde la plataforma y que interopere con una rea de contenido de
Silverlight.
En general, Silverlight 4 promueve la entrada tctil sin formato a eventos del mouse. (Sin embargo,
se puede deshabilitar la promocin por marco tctil, como se describe en secciones posteriores de
este tema).
Dentro de un host, el host del explorador puede promover que ciertos gestos se conviertan en
eventos distintos de MouseDown, MouseMove y MouseUp.
Si desea procesar la entrada multitoque mediante la metfora de gestos, el cdigo debe controlar los
eventos de toque y usar la API expuesta bajo Silverlight 4 para procesarlos en gestos, usando o no la API de
plataforma para los gestos. Esto no es trivial.
API tctil
Una diferencia importante entre la entrada multitoque y otras tcnicas de entrada admitidas en Silverlight
(mouse, teclado o lpiz) es que es preciso registrarse para los eventos multitoque en el nivel de aplicacin, y
no se agregan controladores a elementos de entrada especficos (objetos UIElement ). Esto es coherente
con la metfora de que Silverlight en su conjunto es la "aplicacin" registrada con la plataforma.
Para asignar un controlador de eventos multitoque, se asigna un controlador para el evento
esttico Touch.FrameReported. System.Windows.Input.Touch es una clase de servicio esttica que
existe solamente para este fin con Touch.FrameReported como su nica API.
El controlador que se escribe para Touch.FrameReported est basado en el delegado de
TouchFrameEventHandler.
En un diseo de interfaz de usuario tpico, podra haber reas de la interfaz de usuario dentro de las
cuales se admitiran acciones multitoque concretas y otras reas donde sera mejor usar la
promocin a eventos del mouse y no necesariamente procesar las entradas como multitoque. Para
determinar dnde se encuentra el punto tctil principal, es posible que tenga que evaluar las
coordenadas generales con respecto a la ubicacin del elemento que reconoce la entrada
multitoque, as como sus lmites. Para obtener ms informacin y cdigo de ejemplo, vea
GetPrimaryTouchPoint.
Tal y como se ha mencionado previamente, quizs desee suspender la promocin a eventos del
mouse como parte de la lgica de TouchFrameEventHandler. Para ello, llame a
SuspendMousePromotionUntilTouchUp como una de las primeras operaciones.
Los mensajes de entrada tctil, tal y como se notifican a Silverlight 4, suelen combinarse como
marcos, que comienzan con un punto tctil "descendente" principal. A veces tan solo interesa el
primer punto tctil y la primera accin "ascendente", pero el marco puede contener otros puntos
tctiles y acciones de "movimiento". Para tener acceso a la coleccin completa de puntos de un
marco en sus controladores, llame a GetTouchPoints. Probablemente para un punto tctil
determinado la informacin ms importante sea su Position.
Otras API exponen informacin que en la API de plataforma se encontrara en la estructura
TOUCHINPUT. Estos son algunos ejemplos de esa API: TouchFrameEventArgs.Timestamp;
TouchDevice.DirectlyOver; TouchPoint.Size; TouchPoint.TouchDevice. Dependiendo del escenario,
no siempre necesitara este nivel de informacin.
Eventos de teclado
Silverlight proporciona los eventos de teclado que se describen en la tabla siguiente.
Evento Descripcin
Se produce cuando se presiona una tecla mientras el foco se encuentra en el complemento (y
KeyDown
algn elemento interno).
Se produce cuando se suelta una tecla mientras el foco se encuentra en el complemento (y algn
KeyUp
elemento interno).
KeyUp. Estas teclas se pueden utilizar para iniciar acciones en la aplicacin, incluso si se ejecuta en
modo de pantalla completa.
Todas las dems teclas no generan eventos KeyDown ni KeyUp, por lo que no se puede actuar
sobre las acciones de estas teclas.
Silverlight controla la tecla ESC, que devuelve la aplicacinal modo incrustado.
Esta limitacin de entradas de teclado en el modo de pantalla completa es una caracterstica de seguridad.
Sin embargo, una aplicacin de ejecucin fuera del explorador que utiliza confianza elevada no tiene esta
restriccin y puede controlar todos los eventos de tecla mientras se ejecuta en modo de pantalla completa.
Uso de KeyEventArgs
Todos los eventos de teclado utilizan KeyEventArgs para los datos de evento, y KeyEventArgs contiene las
propiedades siguientes:
Key
PlatformKeyCode
Handled
OriginalSource (heredada de RoutedEventArgs)
Key
El evento KeyDown se genera si se presiona una tecla (del mismo modo, se genera el evento KeyUp cuando
sta se suelta). Normalmente, el usuario escucha los eventos para procesar un valor de tecla concreto. Para
determinar qu tecla se presiona o se libera, ha de comprobar el valor de Key en los datos del evento. Key
devuelve un valor de tecla porttil (un miembro de la enumeracin Key) o devuelve Key.Unknown.
Si el valor de Key no es Unknown, el evento representa un solo y especfico valor de tecla porttil, y se
puede comprobar comparndolo con los valores esperados del controlador para ver si este debe seguir
respondiendo.
Los cdigos de tecla porttiles son un subconjunto comn de todos los cdigos de tecla posibles de las
plataformas compatibles de Silverlight. Por ejemplo, la pulsacin de tecla 'v' se representa como un valor
Key.V de la propiedad Key.
PlatformKeyCode
Algunas pulsaciones de tecla no son porttiles. Un ejemplo es la tecla BLOQ DESPL en Microsoft Windows.
Si el valor de Key es Unknown, ello significa que se ha presionado o liberado una tecla, pero dicha tecla es
de una plataforma determinada. En este caso, se puede comprobar el valor de la propiedad
PlatformKeyCode. Esta propiedad devuelve un entero. El entero se debe evaluar en el contexto de lo que
dicho valor significa para una plataforma determinada y cmo asigna los cdigos de tecla.
Nota:
En este tema no se aborda cmo determinar la plataforma (lo que podra ser necesario para interpretar el
valor de la propiedad PlatformKeyCode). Dependiendo del diseo global de la aplicacin, se puede hacerlo
en el nivel de HTML o el nivel del host del explorador analizando los encabezados de las solicitudes HTTP de
la pgina HTML de hospedaje o estableciendo una variable en el momento de instalar una aplicacin de
ejecucin fuera del explorador. Dentro de la API administrada, Silverlight proporciona la clase
BrowserInformation, as como otros tipos en el espacio de nombres System.Windows.Browser que podran
ser tiles para capturar informacin que tambin est disponible en el DOM HTML o en el host del
explorador.
Teclas modificadoras
Se considera que algunas pulsaciones de tecla son modificadoras. Se trata de teclas que normalmente se
presionan junto con otras. Las teclas modificadoras de todas las plataformas incluyen las teclas MAYS y
CTRL. Algunas teclas modificadoras son especficas de la plataforma.
Nota:
La tecla CTRL puede tener un nombre diferente en algunos teclados. En esta documentacin, se usa la
cadena CTRL para identificar la tecla porque se corresponde con el valor Key.Ctrl en la API.
Normalmente, las teclas modificadoras se interpretan para comprobar si se mantiene presionada una tecla
modificadora mientras se recibe otro evento de tecla. Esto es porque la otra tecla y una tecla modificadora
representan una combinacin de teclas de inters para la aplicacin. En este caso, la informacin de la tecla
modificadora no se transmite como parte de los mismos datos de evento. En su lugar, se utiliza la clase de
utilidad Keyboard desde el interior de los controladores de eventos para comprobar los modificadores,
como parte del control del evento correspondiente al valor de tecla que se modifica potencialmente.
Para determinar qu modificadores se aplican, compruebe el valor de la propiedad Modifiers de la clase
esttica Keyboard. Esta propiedad devuelve un valor de enumeracin de marcador ModifierKeys. El valor es
un marcador porque se podran presionar varios modificadores.
Sin embargo, independientemente de cmo se procesen las teclas modificadoras para otros eventos
correspondientes a teclas no modificadoras, una tecla modificadora genera sus propios eventos de tecla.
Puede decidir controlar estos eventos o llevar a cabo el seguimiento del estado propio de la tecla
modificadora, pero el uso del valor de Modifiers es generalmente ms prctico.
Nota:
Se podra usar la tecla CTRL en combinacin con un clic del mouse para generar un equivalente a entradas
mediante el botn secundario del mouse en las plataformas Macintosh.
En el ejemplo siguiente se muestra cmo implementar el controlador del evento KeyUp para el contenido
XAML correspondiente del ejemplo anterior.
Private Sub TopLevelKB(ByVal sender As Object, ByVal e As KeyEventArgs)
If Not (e.Key = Key.Unknown) Then
Dim fe As FrameworkElement = e.OriginalSource
Dim msg As String = "The key " & e.Key.ToString()
msg = msg & " was pressed while focus was on "
msg = msg & fe.Name
statusTextBlock.Text = msg
End If
End Sub
Controles y foco
Solo un elemento que sea una clase Control puede recibir el foco. Los elementos visuales ms notables que,
por lo tanto, no pueden recibir el foco, son:
Paneles, como StackPanel o Grid
TextBlock
Objetos de texto alineado, como Run
Para que un control reciba el foco, debe cumplirse lo siguiente:
IsEnabled es true.
Visibility es Visible.
El foco no puede estar completamente fuera del rea de contenido de Silverlight.
IsTabStop debe ser true.
Los controles que pueden recibir y presentar las acciones del teclado constituyen los casos ms evidentes
para los que es importante recibir el foco. Esto se debe a que nicamente el elemento con el foco puede
generar los eventos KeyDown y KeyUp. Sin embargo, puede que haya otros controles diseados para recibir
el foco con el fin de poder usar las teclas del teclado como activadores o aceleradores. Por ejemplo, un
control Button admite una caracterstica que permite seleccionarlo recorriendo la secuencia de tabulacin y
presionar la tecla BARRA ESPACIADORA para "hacer clic" en Button sin mover el mouse.
Como parte del comportamiento predeterminado, la mayora de los controles de Silverlight proporciona un
estilo especfico del foco que indica visualmente qu control tiene el foco. En WPF sin el modelo de estados
visuales, una propiedad FocusVisualStyle diferente proporcionaba este estilo. En Silverlight o cuando se usa
el modelo de estados visuales con WPF, usted proporciona estados con nombre que realizan los ajustes
necesarios en la apariencia visual del control. Esos estados se suelen denominar Focused o Unfocused, y se
aplican a veces a las partes de un control compuesto en lugar de a todo el rbol visual.
GotFocus y LostFocus
GotFocus se genera cada vez que el foco cambia de un control a otro dentro del rea de contenido de
Silverlight, y tambin en caso de que una aplicacin se inicie por primera vez y la primera vez que un control
recibe el foco. El control que recibe el foco genera GotFocus. El control que tena el foco anteriormente
genera LostFocus.
Tanto GotFocus como LostFocus son eventos enrutados que se propagan. El escenario de la propagacin
corresponde a la composicin de controles. En el nivel de composicin, el foco podra estar en un objeto
que sea una parte compuesta de un control mayor. El implementador del control compuesto podra desear
que el diseo del control realizara acciones que se apliquen con independencia de la parte del componente
que tenga el foco, o bien realizara acciones diferentes si el foco sale de la composicin inmediata y se
desplaza a otro control.
Si utiliza controles existentes, generalmente interesan ms los comportamientos de foco del control y no de
las partes que lo componen, ya que es el primer punto al que el usuario de controles puede asociar los
controladores de eventos sin tener que recurrir a la aplicacin de una plantilla distinta al control. Sin
embargo, tambin puede comprobar los eventos LostFocus y GotFocus de propagacin en los
contenedores para la composicin de pginas ms grandes: objetos tales como StackPanel o Grid, o
tambin el elemento raz UserControl. Sin embargo, debido al comportamiento de propagacin, puede
resultar til comprobar el valor de OriginalSource en cada evento LostFocus y GotFocus. Puede hacerlo si
desea comprobar si el origen de ese evento de foco es pertinente a algo que se deba hacer con el objeto al
que est asociado el controlador. Puede que ese objeto est por encima de OriginalSource en el rbol de
objetos.
Adems, si va a crear un control, puede que le interesen los mtodos de invalidacin relacionados con
eventos OnGotFocus y OnLostFocus. Estos mtodos proporcionan una manera de implementar el control
del evento como un mtodo de clase, en lugar de como un controlador asociado para las instancias.
Los eventos de foco tienen una implementacin asincrnica, lo que constituye una optimizacin de
rendimiento necesaria en Silverlight. Sin embargo, puede comprobar sincrnicamente el foco en el cuerpo
de un controlador llamando a FocusManager.GetFocusedElement.
Mtodo Focus
La clase base Control proporciona un mtodo Focus. Al llamar a este mtodo mediante programacin, se
intenta establecer el foco en el control donde se llama al mtodo. Focus tiene un tipo de valor devuelto que
informa de si el intento se realiza correctamente. Las posibles razones de que se produzca un error incluyen
todos los puntos mencionados en Controles y foco anteriormente en este mismo tema. Si llama a Focus en
el control que ya tiene el foco, no se genera ningn evento, pero el mtodo devuelve true igualmente para
que la llamada al mtodo no se interprete como un error real al establecer el foco en el destino pretendido.
Secuencias de tabulacin
Los controles que se representan en una interfaz de usuario se colocan en una secuencia de tabulacin
predeterminada. La tecla TAB controla de una manera especial los controles a fin de habilitar esta
funcionalidad, de tal forma que el elemento que recibe la entrada de la tecla TAB pierde el foco y el control
siguiente de la secuencia obtiene foco; en este proceso se generan los eventos LostFocus y GotFocus
pertinentes. Si llama al mtodo Focus, el foco podra salir del punto anterior de la secuencia de tabulacin;
al presionar TAB el usuario va al control siguiente de la secuencia. El comportamiento es similar a presionar
MAYS+TAB, pero la secuencia de tabulacin se recorre en direccin inversa. Para estar contenido en la
secuencia de tabulacin, el control debe poder recibir el foco segn los requisitos enumerados en Controles
y foco.
Los controles poseen las propiedades TabIndex y TabNavigation. Estas propiedades le permiten modificar la
secuencia de tabulacin y el comportamiento predeterminados. TabIndex declara la secuencia y
TabNavigation declara el comportamiento para cualquier secuencia de tabulacin anidada dentro del
control.
Los controles tienen una propiedad IsTabStop que se puede establecer. Algunas clases de controles, como
Label, se inicializan con IsTabStopfalse. Si IsTabStop es false, no puede establecer el foco en el control
mediante Focus, los usuarios no pueden enfocarlo y el control no recibe ningn evento de entrada de
teclado. Para un control como Label, todo ello es inherente al diseo.
En el caso de una aplicacin hospedada en el explorador, la secuencia de tabulacin del contenido de
Silverlight es una secuencia anidada dentro de la secuencia de tabulacin del host del explorador. Los
usuarios pueden salir del rea de contenido de Silverlight y enfocar otros elementos de la pgina HTML de
hospedaje, as como traer el foco a los controles de la interfaz de usuario de la aplicacin de explorador de
hospedaje (por ejemplo, una barra de direcciones).
Automatizacin
El foco de los controles es pertinente para la accesibilidad y automatizacin de Silverlight.
Nota:
Si el destino es Silverlight 4, las pruebas de posicionamiento son tambin importantes para los eventos de
arrastrar y colocar, como DragEnter.
' Global variables used to keep track of the mouse position and whether the object is captured by the mouse.
Dim isMouseCaptured As Boolean
Dim mouseVerticalPosition As Double
Dim mouseHorizontalPosition As Double
4.4. Imprimir
A veces desear agregar funciones de impresin a la aplicacin de Silverlight y no confiar en las opciones de
impresin del explorador. Por ejemplo, quizs desee permitir al usuario imprimir un control de imagen que
contiene un mapa. La clase PrintDocument proporciona la funcin de impresin para una aplicacin de
Silverlight. En este tema se describe cmo agregar funciones de impresin a sus aplicaciones de Silverlight y
contiene las siguientes secciones:
Dentro del cuadro de dilogo de impresin, el usuario puede seleccionar la configuracin de impresora que
desee y, a continuacin, hacer clic en Imprimir para continuar con la operacin de impresin o en Cancelar
para cancelar la operacin de impresin. En la ilustracin siguiente se muestra un ejemplo del cuadro de
dilogo de impresin para Windows.
End Sub
<StackPanel x:Name="LayoutRoot">
<Button Margin="5" Width="200" Content="Click to print" x:Name="PrintButton"
Click="PrintButton_Click" />
<Image Width="600" Height="600" Source="RedmondMap.jpg" x:Name="mapImage"/>
</StackPanel>
Adems de especificar UIElement, puede obtener el tamao fsico del rea de impresin con la propiedad
PrintPageEventArgs.PrintableArea. Si UIElement supera PrintableArea, el contenido se recortar en los
lmites de PrintableArea. Las dimensiones del rea imprimible son en pxeles basndose en la configuracin
de pantalla.
5. Controles
Silverlight proporciona una completa biblioteca de controles que admiten el desarrollo de interfaces de
usuario.
A
Proporciona un cuadro de texto para los datos proporcionados por el
SDK de
AutoCompleteBox usuario y una lista desplegable que contiene posibles coincidencias basadas
Silverlight
en la entrada del cuadro de texto.
B
Proporciona un borde, un fondo o ambos a otro control. Un borde puede Motor en tiempo
Border
contener un nico elemento secundario. de ejecucin
Proporciona un evento de clic para responder a los datos proporcionados por el Motor en tiempo
Button
usuario con un mouse, teclado, lpiz u otro dispositivo de entrada. de ejecucin
C
Proporciona una interfaz de usuario grfica que permite al usuario seleccionar
SDK de
Calendar una fecha. Muestra a la vez las fechas de un mes y proporciona la capacidad
Silverlight
de desplazarse de mes en mes o de cambiar a la vista de todo el ao.
Proporciona una superficie para mostrar elementos secundarios en las Motor en
Canvas coordenadas concretas del lienzo. Un lienzo puede contener uno o varios tiempo de
objetos UIElement. ejecucin
CheckBox Permite al usuario seleccionar (activar) una opcin o cancelar su seleccin Motor en
D
Proporciona una forma flexible de mostrar una coleccin de datos en filas y
columnas. Los tipos de columnas integrados incluyen la columna de cuadros
de texto, la columna de casillas y la columna de plantilla para hospedar SDK de
DataGrid
contenido personalizado. El tipo de fila integrado incluye una seccin de Silverlight
detalles desplegable que se puede utilizar para mostrar contenido adicional
debajo de los valores de celda.
Proporciona una interfaz de usuario para la paginacin a travs de una SDK de
DataPager
coleccin de datos que implementa IPagedCollectionView. Silverlight
Permite al usuario seleccionar una fecha escribindola en un control TextBox SDK de
DatePicker
o utilizando un control Calendar desplegable. Silverlight
Muestra una descripcin y realiza el seguimiento del estado del error para un SDK de
DescriptionViewer
control asociado. Silverlight
F
Frame Admite la navegacin a los controles Page. SDK de Silverlight
G
Proporciona una superficie compuesta de filas y columnas para mostrar
Motor en
elementos secundarios. Se definen las filas y columnas para un objeto Grid y, a
Grid tiempo de
continuacin, se asignan los objetos a una fila o columna concreta de la
ejecucin
cuadrcula. Opcionalmente, puede mostrar las lneas de la cuadrcula.
Permite al usuario redistribuir el espacio entre las filas o columnas de un control
Grid. Representa un elemento grfico que el usuario puede agarrar y arrastrar. Las
SDK de
GridSplitter propiedades adjuntas que rigen su alineacin y las propiedades de fila o columna
Silverlight
de Grid determinan la direccin y manera en las que GridSplitter distribuye el
espacio.
H
Representa un control que contiene una coleccin de elementos y un SDK de
HeaderedItemsControl
encabezado. Silverlight
Representa un control de botn que muestra un hipervnculo.
Motor en
Cuando se hace clic en l, HyperlinkButton permite al usuario visitar
HyperlinkButton tiempo de
una pgina web que pertenece a la misma aplicacin web o que es
ejecucin
externa a la aplicacin actual.
I
Muestra una imagen en formato PNG o JPEG. El control Image muestra Motor en
Image imgenes indizadas con una profundidad de color de 1, 4 u 8 bits o imgenes tiempo de
en color verdadero con una profundidad de color de 24 32 bits. ejecucin
Proporciona una superficie de dibujo que admite las caractersticas de Tablet Motor en
InkPresenter PC. InkPresenter se deriva de Canvas y puede mostrar uno o ms trazos y tiempo de
objetos UIElement. ejecucin
L
Muestra una leyenda, el indicador de campo obligatorio y el indicador de error de SDK de
Label
validacin para un control asociado. Silverlight
Contiene una coleccin de elementos. Puede rellenar el control enlazndolo a un
Motor en
origen de datos o mostrando elementos independientes. El cuadro de lista es un
ListBox tiempo de
control de elementos, lo que significa que puede rellenarlo con elementos que
ejecucin
contengan texto u otros controles.
M
Hospeda contenido de audio o vdeo. Un control MediaElement Motor en
MediaElement proporciona una regin rectangular que puede mostrar vdeo en su tiempo de
superficie o reproducir audio si no hay vdeo presente. ejecucin
Permite al usuario abrir una imagen en varias resoluciones que se puede Motor en
MultiScaleImage escalar y se puede cambiar de posicin para verla con detalle. tiempo de
MultiScaleImage es para su uso con la tecnologa Deep Zoom. ejecucin
O
Representa un cuadro de dilogo de archivos abierto que permite al Motor en tiempo de
OpenFileDialog
usuario seleccionar uno o varios archivos. ejecucin
P
SDK de
Page Encapsula el contenido al que puede navegar un control Frame.
Silverlight
Se usa para escribir informacin confidencial o privada en un rea de texto de Motor en
PasswordBox una sola lnea sin ajuste. No se ve el texto real sino los caracteres que tiempo de
representan el contenido. ejecucin
Superpone el contenido al contenido existente. Un control Popup resulta til
Motor en
para mostrar temporalmente informacin que realiza una tarea determinada.
Popup tiempo de
Un control emergente siempre aparecer encima del contenido existente, a
ejecucin
menos que otro control emergente se abra encima de l.
Motor en
Indica el progreso de una operacin. Este control se puede utilizar para mostrar
ProgressBar tiempo de
un progreso genrico o un progreso que cambia segn un valor.
ejecucin
R
Permite al usuario seleccionar una sola opcin de un grupo de opciones. Los
controles RadioButton se agrupan colocndolos dentro de un elemento Motor en
RadioButton primario o estableciendo la propiedad GroupName de cada RadioButton en un tiempo de
grupo concreto. Cuando estn agrupados, los controles RadioButton son ejecucin
mutuamente excluyentes.
Representa un botn que genera su evento de clic repetidamente desde el
Motor en
momento en que se presiona el botn hasta que se suelta. Un control
RepeatButton tiempo de
RepeatButton contiene propiedades que especifican el retraso antes de que se
ejecucin
repitan los clics y el intervalo entre los clics.
Motor en
Representa un control de edicin de texto enriquecido que admite texto con
RichTextBox tiempo de
formato, hipervnculos, imgenes insertadas y otro contenido enriquecido.
ejecucin
S
SaveFileDialog Proporciona un cuadro de dilogo que permite al usuario especificar Motor en
T
Proporciona una interfaz con fichas en la que mostrar elementos. Los elementos SDK de
TabControl
secundarios se hospedan en un control TabItem. Silverlight
Muestra pequeas cantidades de contenido de texto. Puede establecer el
Motor en
contenido de TextBlock mediante la propiedad Text. Como alternativa, puede
TextBlock tiempo de
establecer la propiedad Inlines en una coleccin de objetos Inline, tales como los
ejecucin
objetos Run o LineBreak.
Se usa para obtener datos proporcionados por el usuario o para mostrar texto. El
Motor en
control de cuadro de texto se utiliza generalmente para el texto que se puede
TextBox tiempo de
editar, aunque tambin puede configurarse como control de solo lectura. Los
ejecucin
cuadros de texto pueden mostrar varias y ajustar el texto al tamao del control.
Motor en
Proporciona informacin al usuario sobre un elemento de la interfaz de usuario
ToolTip tiempo de
mediante una ventana emergente.
ejecucin
SDK de
TreeView Representa un control que muestra datos jerrquicos.
Silverlight
V
SDK de
ValidationSummary Muestra un resumen de los errores de validacin en un formulario.
Silverlight
Motor en
Proporciona un control que puede ajustar o escalar su contenido
Viewbox tiempo de
para rellenar el espacio disponible.
ejecucin
Proporciona un control de panel de pila que organiza el contenido Motor en
VirtualizingStackPanel que est visible en la pantalla, creando los elementos adicionales de tiempo de
la interfaz de usuario que sean necesarios. ejecucin
W
Proporciona una superficie para mostrar contenido HTML cuando la Motor en tiempo de
WebBrowser
aplicacin se hospeda fuera del explorador. ejecucin
Controles de texto
Controles que muestran un elemento nico
Controles que muestran un elemento nico y un encabezado
Controles que muestran una coleccin de elementos
Controles que muestran una coleccin de elementos y un encabezado
Controles que muestran otros elementos de la interfaz de usuario
Informacin general
En la tabla siguiente se muestra una lista de muchos de los controles de Silverlight ms comunes, con su
tipo de contenido y su propiedad de contenido correspondientes.
Controles de texto
Los controles de texto muestran contenido de tipo string. Hay tres tipos de controles de texto.
TextBlock
TextBox y PasswordBox
RichTextBox
Estos controles permiten elegir entre texto de solo lectura con varios formatos aplicados, texto editable con
un formato nico y texto editable con formato enriquecido.
TextBlock
El control TextBlock hereda directamente de la clase FrameworkElement. Muestra texto de solo lectura al
que se puede dar formato de modo extensivo. Su contenido se establece con las propiedades Inlines o Text.
La propiedad Text toma como valor String. La propiedad Inlines toma como valor InlineCollection.
InlineCollection acepta objetos Inline. Inline es una clase abstracta; as pues, para rellenar la coleccin se
utilizan objetos Run o LineBreak que se derivan de Inline. Una ventaja de establecer la propiedad Inlines es
que se puede especificar la familia de fuentes, el estilo, el peso y el tamao para cada objeto Inline de la
coleccin Inlines. Sin embargo, si desea utilizar la misma fuente o estilo de fuente para todo el texto de
TextBlock, la propiedad Text es la opcin ms fcil.
En el ejemplo siguiente se muestra cmo establecer el contenido de los objetos TextBlock mediante las
propiedades Inlines y Text en XAML y en cdigo.
<TextBlock Margin="10" Text="TextBlock" />
...
<TextBlock Margin="10">
<Run FontFamily="Arial" FontSize="20">TextBlock</Run>
<LineBreak />
<Run FontFamily="Courier New" FontWeight="Bold" FontSize="14">using Inlines</Run>
</TextBlock>
TextBox y PasswordBox
La clase TextBox hereda de Control y muestra texto que el usuario puede modificar. El contenido de TextBox
se establece mediante la propiedad Text. El formato del texto mostrado se limita al formato que se aplica al
control, que es aplicable a todo el texto que contiene. La propiedad TextWrapping permite establecer el
ajuste del texto. El estilo de fuente, as como su grosor, tamao y familia se especifican mediante las
propiedades FontStyle, FontWeight, FontSize y FontFamily, respectivamente. Los valores de las propiedades
se aplican a todo el texto mostrado en el control TextBox.
PasswordBox hereda de TextBox. Su contenido se establece mediante la propiedad Text. PasswordBox
permite una lnea de texto nica y oculta el texto con un smbolo. Esto permite que el usuario escriba datos
confidenciales, como su contrasea.
En el ejemplo de cdigo siguiente se muestra cmo se establece la propiedad Text de un control TextBox en
XAML y en cdigo.
<TextBox Margin="10" HorizontalAlignment="Left" Width="100"
Text="TextBox with a line of text that wraps."
FontFamily="Arial" TextWrapping="Wrap" />
RichTextBox
La clase RichTextBox hereda de Control y muestra texto enriquecido que el usuario puede editar. Establezca
el contenido de un control RichTextBox con la propiedad Blocks. La propiedad Blocks contiene una
coleccin de elementos Paragraph. Un elemento Paragraph puede contener muchos tipos de elementos,
incluyendo los siguientes:
Inline
InlineUIContainer , que puede contener objetos FrameworkElement, como Image o Button
Run
Span
Bold
Hyperlink
Italic
Underline
Nota:
El control TabItem forma parte del SDK de Silverlight y requiere la siguiente declaracin de espacio de
nombres XAML:
xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
<sdk:TabControl>
<sdk:TabItem Header="TabItem1" >
<sdk:TabItem.Content>
<StackPanel Orientation="Horizontal">
<Rectangle Width="10" Fill="Green" />
<TextBlock Margin="2" Text="TabItem1 Content" />
</StackPanel>
</sdk:TabItem.Content>
</sdk:TabItem>
<sdk:TabItem Content="TabItem 2 Content">
<sdk:TabItem.Header>
<StackPanel Orientation="Horizontal">
<Rectangle Width="10" Fill="Green" />
Propiedad Items
Puede rellenar directamente un control de elementos estableciendo su propiedad Items. La propiedad Items
es del tipo ItemCollection, que es una coleccin PresentationFrameworkCollection(Of T) genrica. Tambin
puede agregar elementos a una coleccin existente mediante el mtodo Add. No se pueden agregar
elementos a una coleccin creada mediante la propiedad ItemsSource. Al crear los contenedores de
elementos en XAML, se agregan elementos a la coleccin de elementos. En el ejemplo siguiente se muestra
cmo crear y agregar objetos ComboBoxItem a un control ComboBox en XAML y en cdigo.
<ComboBox>
<ComboBox.Items>
<ComboBoxItem Content="Item 1" />
<ComboBoxItem Content="Item 2" />
<ComboBoxItem Content="Item 3" />
</ComboBox.Items>
</ComboBox>
Propiedad ItemsSource
La propiedad ItemsSource del control ItemsControl permite utilizar cualquier tipo que implemente
IEnumerable como contenido de ItemsControl. Normalmente, se utiliza ItemsSource para mostrar una
recoleccin de datos o enlazar un control ItemsControl a un objeto de coleccin. Al establecer la propiedad
ItemsSource, se crean automticamente los contenedores de elementos para cada elemento de la coleccin.
En el ejemplo siguiente se muestra cmo establecer la propiedad ItemsSource en una coleccin de objetos
Uri mediante una combinacin de XAML y cdigo.
<ComboBox x:Name="UriBox1" />
Tambin puede enlazar a una coleccin estableciendo la propiedad ItemsSource en un objeto Binding y
estableciendo DataContext para el control. En el ejemplo siguiente se muestra cmo establecer la propiedad
ItemsSource en un objeto Binding y la propiedad DataContext en la coleccin de identificadores URI
mediante una combinacin de XAML y cdigo.
<ComboBox ItemsSource="{Binding}" x:Name="UriBox2" />
AutoCompleteBox
AutoCompleteBox es un control especial que combina un cuadro de texto para los datos proporcionados
por el usuario y un control de elementos que se muestra en una lista desplegable. El control de elementos
contiene posibles coincidencias basadas en la entrada del cuadro de texto. Se agrega contenido a la parte
de texto del control mediante la propiedad Text y se agrega contenido a la lista desplegable mediante la
creacin de un enlace a una lista con la propiedad ItemsSource.
DataGrid
DataGrid es til para mostrar recolecciones de datos, pero no es un control de elementos. El control
DataGrid hereda directamente de la clase Control. Su contenido se establece estableciendo la propiedad
ItemsSource en una coleccin de IEnumerable o en Binding, que resulta parecido a un control de elementos.
Sin embargo, un control DataGrid no se puede rellenar manualmente como un control de elementos. Al
establecer ItemsSource en una coleccin de objetos, se crea automticamente una fila para cada objeto de
la coleccin. Puede establecer AutoGenerateColumns en true a fin de generar automticamente una
columna para cada propiedad del tipo de objeto. Tambin puede especificar las columnas personalmente
con la propiedad Columns. Hay tipos diferentes de columnas que contienen tipos diferentes de contenido.
Nota:
El control DataGrid forma parte del SDK de Silverlight y requiere la siguiente declaracin de espacio de
nombres:
xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
En el ejemplo siguiente, se muestra cmo establecer la propiedad ItemsSource en una coleccin de objetos
Uri mediante una combinacin de XAML y cdigo. AutoGenerateColumns se establece en true, para que se
cree automticamente una columna para cada propiedad pblica de Uri.
<sdk:DataGrid x:Name="UriGrid1" AutoGenerateColumns="True" />
desplegable.
Presentacin de la Motor en
Muestra cantidades pequeas de texto de solo
informacin (solo TextBlock tiempo de
lectura.
lectura) ejecucin
Motor en
Muestra el progreso actual de una operacin al
ProgressBar tiempo de
usuario.
ejecucin
Proporciona un control para mostrar o editar texto
Motor en enriquecido. Admite texto con formato,
RichTextBox tiempo de hipervnculos, imgenes y otro contenido
ejecucin enriquecido. Se puede establecer como de solo
lectura.
Representa un control que proporciona un cuadro
de texto para los datos proporcionados por el
Presentacin y SDK de
AutoCompleteBox usuario y una lista desplegable que contiene
edicin de texto Silverlight
posibles coincidencias basadas en la entrada del
cuadro de texto.
Motor en Proporciona un control que permite al usuario
PasswordBox tiempo de escribir datos confidenciales, como una
ejecucin contrasea.
Motor en
Proporciona un control para mostrar o editar
TextBox tiempo de
texto.
ejecucin
Proporciona un control para mostrar o editar texto
Motor en
enriquecido. Admite texto con formato,
RichTextBox tiempo de
hipervnculos, imgenes y otro contenido
ejecucin
enriquecido.
Muestra una coleccin de datos en filas y
Presentacin de SDK de
DataGrid columnas. Puede cambiar el tipo de fila o columna
datos Silverlight
para adaptarlo a las necesidades de su aplicacin.
Proporciona una interfaz de usuario para la
SDK de
DataPager paginacin a travs de una coleccin de datos que
Silverlight
implementa IPagedCollectionView.
Muestra datos jerrquicos en una estructura de
SDK de
TreeView rbol con elementos que se pueden expandir y
Silverlight
contraer.
Motor en
Presentacin de
Image tiempo de Muestra una imagen.
grficos y vdeo
ejecucin
Motor en Permite al usuario abrir una imagen con varias
MultiScaleImage tiempo de resoluciones que se puede escalar o cambiar de
ejecucin posicin para verla con detalle.
Hospeda contenido de audio o vdeo. Proporciona
Motor en
una regin rectangular que puede mostrar vdeo
MediaElement tiempo de
en su superficie o reproducir audio si no hay vdeo
ejecucin
presente.
Motor en
Proporciona una superficie de dibujo que admite
InkPresenter tiempo de
las caractersticas de Tablet PC.
ejecucin
Presentacin HTML, Motor en Proporciona una superficie para mostrar contenido
ejecucin fuera del WebBrowser tiempo de HTML cuando la aplicacin se hospeda fuera del
explorador ejecucin explorador.
Diseo y agrupacin Motor en Proporciona un borde, un fondo o ambos a otro
Border
de elementos tiempo de control.
ejecucin
Motor en Proporciona una superficie para mostrar
Canvas tiempo de elementos secundarios en las coordenadas
ejecucin concretas del lienzo.
Motor en
Representa un control con una sola parte de
ContentControl tiempo de
contenido.
ejecucin
Proporciona una superficie compuesta de filas y
Motor en columnas para mostrar elementos secundarios. Se
Grid tiempo de definen las filas y columnas para una cuadrcula y,
ejecucin a continuacin, se asignan los objetos a una fila o
columna concreta de la cuadrcula.
SDK de Permite al usuario cambiar el tamao de las
GridSplitter
Silverlight columnas o filas de un control Grid.
Motor en Proporciona una superficie para mostrar
StackPanel tiempo de elementos secundarios en una lnea en sentido
ejecucin horizontal o vertical.
Motor en Proporciona un control que puede ajustar o
Viewbox tiempo de escalar su contenido para rellenar el espacio
ejecucin disponible.
Proporciona un control de panel de pila que
Motor en
organiza el contenido que est visible en la
VirtualizingStackPanel tiempo de
pantalla, creando los elementos adicionales de la
ejecucin
interfaz de usuario que sean necesarios.
Representa un control que proporciona una barra
Motor en
de desplazamiento con un control de posicin
ScrollBar tiempo de
(Thumb) deslizante cuya posicin corresponde a
ejecucin
un valor.
Motor en
Proporciona una superficie que se puede
ScrollViewer tiempo de
desplazar para mostrar un elemento secundario.
ejecucin
Proporciona una interfaz con fichas en la que
SDK de
TabControl mostrar elementos. Los elementos secundarios se
Silverlight
hospedan en un control TabItem.
SDK de Muestra una descripcin y realiza el seguimiento
Ayuda del usuario DescriptionViewer
Silverlight del estado del error para un control asociado.
Muestra una leyenda, el indicador de campo
SDK de
Label obligatorio y el indicador de error de validacin
Silverlight
para un control asociado.
Motor en Proporciona informacin al usuario sobre un
ToolTip tiempo de elemento de la interfaz de usuario mediante una
ejecucin ventana emergente.
SDK de Muestra un resumen de los errores de validacin
ValidationSummary
Silverlight en un formulario.
SDK de
Navegacin Frame Admite la navegacin a los controles Page.
Silverlight
SDK de Encapsula el contenido al que puede navegar un
Page
Silverlight control Frame.
Motor en
Ventanas y cuadros Permite al usuario seleccionar uno o ms archivos
OpenFileDialog tiempo de
de dilogo del sistema de archivos.
ejecucin
Motor en
Permite al usuario especificar opciones para
SaveFileDialog tiempo de
guardar un archivo.
ejecucin
Se construye el control.
O bien
2. Seleccione Propiedades.
3. En la ventana Propiedades, busque la propiedad que desee establecer y especifique el nuevo valor.
En la ilustracin siguiente, se muestra un ejemplo de la ventana Propiedades.
En el ejemplo siguiente, se muestra cmo establecer mediante XAML propiedades que cambian la
apariencia de un botn. Las propiedades utilizadas en este ejemplo se aplican a muchos controles
de Silverlight.
<Button Margin="5" Height="50" Width="100" Background="Blue" Content="Click Me!" x:Name="button2" />
1. Cree un estilo como un recurso siguiendo los pasos descritos en el procedimiento anterior.
2. Seleccione el control al que desee aplicar el estilo.
3. Abra la ventana Propiedades y busque la propiedad Style.
4. Haga clic en la columna de valores a la derecha para que se abra el editor de recursos de
propiedad.
5. Expanda la seccin Local y seleccione el estilo en la lista.
Se agrega al control una propiedad Style junto con una Extensin de marcado StaticResource
mediante XAML.
Los valores de propiedad y los estilos permiten cambiar solo algunos aspectos de la apariencia de un
control. Para cambiar completamente la apariencia y el comportamiento de un control, es preciso usar su
plantilla. El objeto ControlTemplate se define en XAML, ya sea de forma insertada o en un archivo
independiente, y contiene la apariencia visual y el comportamiento de un control. Para cambiar la plantilla
de un control, se establece la propiedad Template en XAML al crear un estilo. La mayora de los controles
tienen una plantilla predeterminada. Se puede reemplazar la plantilla predeterminada de un control o se
puede modificar la plantilla para agregar, reorganizar o eliminar determinados elementos de un control.
3. Haga doble clic en el evento que desee controlar para crear un nuevo controlador de eventos.
Se crea el controlador de eventos para el control. Se abre el archivo de cdigo subyacente y el
cursor se coloca en el controlador de eventos. En los proyectos de Visual C#, se agrega al archivo
XAML un atributo que especifica el controlador de eventos. En los proyectos de Visual Basic, no se
modifica el archivo XAML.
Para crear un controlador de eventos en el editor de XAML
1. En la vista XAML, seleccione el control para el que desee crear un controlador de eventos.
2. En la etiqueta de apertura del elemento, empiece a escribir el nombre del evento que desee
controlar, por ejemplo, el evento Click o MouseEnter.
Cuando empiece a escribir el nombre del evento, aparecer una ventana de IntelliSense con los
eventos disponibles, tal y como se muestra en la ilustracin siguiente.
5.5.2. DataGrid
El control DataGrid proporciona una forma flexible de mostrar una coleccin de datos en filas y columnas.
Los tipos de columnas integrados incluyen la columna de texto, la columna de casillas y la columna de
plantilla para hospedar contenido personalizado. El tipo de fila integrado incluye una seccin de detalles
desplegable que se puede utilizar para mostrar contenido adicional debajo de los valores de celda.
El control DataGrid admite las opciones de formato de tabla comunes, como los fondos de fila alternos y la
capacidad de mostrar u ocultar encabezados, lneas de cuadrcula y barras de desplazamiento. Adems, el
control proporciona varias propiedades de estilo y plantilla que puede usar para cambiar por completo la
apariencia del control y de sus filas, columnas, celdas y encabezados de fila o columna.
En los temas de esta seccin se describen los conceptos y las tcnicas adicionales que puede usar para crear
caractersticas del control DataGrid en las aplicaciones.
Nota:
En un equipo Macintosh, use la tecla Comando en lugar de la tecla CTRL.
Tecla o
combinacin de Descripcin
teclas
Mueve el foco a la celda que se encuentra directamente debajo de la celda actual. Si el
FLECHA ABAJO
foco est en la ltima fila, al presionar la FLECHA ABAJO, no sucede nada.
Mueve el foco a la celda que se encuentra directamente encima de la celda actual. Si el
FLECHA ARRIBA
foco est en la primera fila, al presionar la FLECHA ARRIBA, no sucede nada.
Mueve el foco a la celda anterior de la fila. Si el foco est en la primera celda de la fila, al
FLECHA
presionar la FLECHA IZQUIERDA, no sucede nada. Si el foco se encuentra en un
IZQUIERDA
encabezado de grupo de filas, al presionar la FLECHA IZQUIERDA, se contrae el grupo.
Mueve el foco a la siguiente celda de la fila. Si el foco est en la ltima celda de la fila, al
FLECHA
presionar la FLECHA DERECHA, no sucede nada. Si el foco se encuentra en un encabezado
DERECHA
de grupo de filas, al presionar la FLECHA DERECHA, se expande el grupo.
INICIO Mueve el foco a la primera celda de la fila actual.
FIN Mueve el foco a la ltima celda de la fila actual.
Desplaza el control hacia abajo por el nmero de filas que se muestran. Mueve el foco
AV PG hasta la ltima fila mostrada sin cambiar las columnas. Si la ltima fila se muestra solo
parcialmente, desplaza la cuadrcula de modo que se muestre totalmente la ltima fila.
Desplaza el control hacia arriba por el nmero de filas que se muestran. Desplaza el foco
RE PG a la primera fila mostrada sin cambiar las columnas. Si la primera fila se muestra solo
parcialmente, desplaza la cuadrcula de modo que se muestre totalmente la primera fila.
Si la celda actual est en modo de edicin, mueve el foco a la celda siguiente de la fila
actual. Si el foco ya est en la ltima celda de la fila, confirma los cambios realizados y
mueve el foco a la primera celda de la siguiente fila. Si el foco est en la ltima celda del
control, desplaza el foco al siguiente control en el orden de tabulacin del contenedor
TAB
primario.
actual. Si el foco ya est en la primera celda de la fila, confirma los cambios realizados y
mueve el foco a la ltima celda de la fila anterior. Si el foco est en la primera celda del
control, desplaza el foco al control anterior en el orden de tabulacin del contenedor
primario.
Teclas de seleccin
Si el valor de la propiedad SelectionMode se establece en Extended, el comportamiento de navegacin no
cambia, pero si se navega con el teclado y al mismo tiempo se presiona la tecla MAYS (incluida la
combinacin de teclas CTRL+MAYS), se modifica una seleccin de varias filas. Antes de comenzar la
navegacin, el control marca la fila actual como fila delimitadora. Cuando se navega presionando la tecla
MAYS, la seleccin incluye todas las filas comprendidas entre la fila delimitadora y la fila actual.
Las siguientes teclas de seleccin modifican una seleccin de varias filas.
MAYS+FLECHA ABAJO
MAYS+FLECHA ARRIBA
MAYS+FLECHA IZQUIERDA
MAYS+FLECHA DERECHA
MAYS+INICIO
MAYS+FIN
MAYS+AV PG
MAYS+RE PG
CTRL+MAYS+FLECHA ABAJO
CTRL+MAYS+FLECHA ARRIBA
CTRL+MAYS+FLECHA IZQUIERDA
CTRL+MAYS+FLECHA DERECHA
CTRL+MAYS+INICIO
CTRL+MAYS+FIN
CTRL+MAYS+AV PG
CTRL+MAYS+RE PG
Nota:
Al hacer clic en una celda con el botn primario del mouse, siempre se cambia la celda actual. En Silverlight,
cuando se hace clic con el botn secundario del mouse, siempre se abre el men contextual Configuracin
de Silverlight.
Accin del mouse Descripcin
Hacer clic en una fila no
La fila en la que se ha hecho clic se convierte en la fila actual.
seleccionada
Hacer clic en una celda de
Coloca la celda en la que se ha hecho clic en modo de edicin.
la fila actual
Si el valor de la propiedad DataGrid.CanUserReorderColumns es true y el valor
Arrastrar una celda de
de la propiedad DataGridColumn.CanUserReorder es true para la columna
encabezado de columna
actual, mueve la columna de modo que se pueda colocar en la nueva posicin.
Arrastrar una lnea de Si el valor de la propiedad DataGrid.CanUserResizeColumns es true y el valor de
separacin de encabezados la propiedad DataGridColumn.CanUserResize es true para la columna actual,
de columna cambia el tamao de la columna.
Si el valor de la propiedad DataGrid.CanUserSortColumns es true y el valor de la
propiedad DataGridColumn.CanUserSort es true para la columna actual, ordena
la columna.
Hacer clic en una celda de Al hacer clic en el encabezado de una columna que ya est ordenada, se
encabezado de columna invertir la direccin de ordenacin de esa columna.
Ejemplo
En el ejemplo de cdigo siguiente se crea una List(Of T) de objetos Task y la lista de tareas se muestra en
una DataGrid denominada dataGrid1. DataGrid es de solo lectura, pero muestra una seccin de detalles de
fila que permite la edicin. La seccin de detalles de fila se enlaza al mismo DataContext que DataGridRow.
Para que muestren los cambios hechos en los datos de origen en la seccin de detalles de fila que se va a
mostrar en DataGridRow, la clase Task implementa la interfaz INotifyPropertyChanged. Tambin se
proporciona una interfaz de usuario para establecer las opciones de los detalles de fila.
<UserControl x:Class="DGRowDetails.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk">
<ScrollViewer VerticalScrollBarVisibility="Auto" BorderThickness="0" Padding="0">
<StackPanel x:Name="LayoutRoot" Background="White" Margin="5">
<StackPanel Margin="0,0,0,5">
<StackPanel Orientation="Horizontal">
<Border BorderBrush="Black" BorderThickness="1" Padding="3" Width="180">
<StackPanel>
<TextBlock Text="Row Details Visibility" FontSize="12"/>
<ComboBox SelectionChanged="cbRowDetailsVis_SelectionChanged">
<ComboBoxItem Content="Selected Row (Default)" IsSelected="True" />
<ComboBoxItem Content="All"/>
<ComboBoxItem Content="None"/>
</ComboBox>
<CheckBox Content="Freeze Row Details" Margin="0,3,0,0"
Checked="cbFreezeRowDetails_Changed"
Unchecked="cbFreezeRowDetails_Changed" />
</StackPanel>
</Border>
</StackPanel>
</StackPanel>
<sdk:DataGrid x:Name="dataGrid1" Height="400" IsReadOnly="True" >
<sdk:DataGrid.RowDetailsTemplate>
<!-- Begin row details section. -->
<DataTemplate>
<Border BorderBrush="Black" BorderThickness="1" Background="Tan">
<StackPanel Orientation="Horizontal">
<StackPanel>
<StackPanel Orientation="Horizontal">
<!-- Controls are bound to Task properties. -->
<TextBlock FontSize="16" Foreground="MidnightBlue" Text="{Binding Name}"
Margin="0,0,10,0" VerticalAlignment="Bottom" />
<TextBlock FontSize="12" Text="Due Date: " VerticalAlignment="Bottom"/>
<sdk:DatePicker SelectedDate="{Binding DueDate, Mode=TwoWay}" VerticalAlignment="Bottom" />
<TextBlock FontSize="12" Text=" Complete:" VerticalAlignment="Bottom" />
<CheckBox IsChecked="{Binding Complete, Mode=TwoWay}"
VerticalAlignment="Center" />
</StackPanel>
<TextBlock FontSize="12" Text="Notes: " />
<TextBox FontSize="12" Text="{Binding Notes, Mode=TwoWay}"
Width="420" TextWrapping="Wrap"/>
</StackPanel>
</StackPanel>
</Border>
</DataTemplate>
<!-- End row details section. -->
</sdk:DataGrid.RowDetailsTemplate>
</sdk:DataGrid>
' Generate some task data and add it to the task list.
For index = 1 To itemsCount
taskList.Add(New Task() With _
{.Name = "Task " & index.ToString(), _
.DueDate = Date.Now.AddDays(index), _
.Complete = (index Mod 3 = 0), _
.Notes = "Task " & index.ToString() & " is due on " & Date.Now.AddDays(index) & ". Lorum ipsum..." _
})
Next
Me.dataGrid1.ItemsSource = taskList
End Sub
' Set the row details visibility to the option selected in the combo box.
Private Sub cbRowDetailsVis_SelectionChanged(ByVal sender As System.Object, ByVal e As
System.Windows.Controls.SelectionChangedEventArgs)
Dim cb As ComboBox = sender
Dim cbi As ComboBoxItem = cb.SelectedItem
If Me.dataGrid1 IsNot Nothing Then
If cbi.Content.ToString() = "Selected Row (Default)" Then
Me.dataGrid1.RowDetailsVisibilityMode = DataGridRowDetailsVisibilityMode.VisibleWhenSelected
ElseIf cbi.Content.ToString() = "None" Then
Me.dataGrid1.RowDetailsVisibilityMode = DataGridRowDetailsVisibilityMode.Collapsed
ElseIf cbi.Content.ToString() = "All" Then
Me.dataGrid1.RowDetailsVisibilityMode = DataGridRowDetailsVisibilityMode.Visible
End If
End If
End Sub
' Freeze the row details if the check box is checked.
Private Sub cbFreezeRowDetails_Changed(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
Dim cb As CheckBox = sender
If Me.dataGrid1 IsNot Nothing Then
Me.dataGrid1.AreRowDetailsFrozen = cb.IsChecked
End If
End Sub
End Class
Imports System.ComponentModel
Ejemplo
En el ejemplo de cdigo siguiente se crea una List(Of T) de objetos Task y la lista de tareas se muestra en
una DataGrid denominada dataGrid1. En el controlador de eventos AutoGeneratingColumn de dataGrid1, se
realizan las personalizaciones siguientes.
El encabezado Header de la columna 'Name' se modifica por 'Task'.
La columna DueDate generada automticamente se reemplaza por un objeto DataGridTemplate
Column personalizado.
Se cancela la generacin automtica de todas las columnas que muestran datos de tipo Boolean.
<UserControl
xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
x:Class="DGAutoGenColumn.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="300">
<UserControl.Resources>
<DataTemplate x:Key="dueDateCellTemplate">
<TextBlock
Text="{Binding DueDate}"
Margin="5,4,5,4" />
</DataTemplate>
<DataTemplate x:Key="dueDateCellEditingTemplate">
<sdk:DatePicker
SelectedDate="{Binding DueDate, Mode=TwoWay}" />
</DataTemplate>
</UserControl.Resources>
<StackPanel x:Name="LayoutRoot" Background="White" Margin="5">
<TextBlock Text="Column AutoGeneration" Foreground="#FF5C9AC9"
FontSize="18" FontFamily="Verdana" FontWeight="Bold" />
<sdk:DataGrid x:Name="dataGrid1"
AutoGenerateColumns="True"
AutoGeneratingColumn="dataGrid1_AutoGeneratingColumn" />
</StackPanel>
</UserControl>
End If
' Cancel AutoGeneration of all boolean columns.
If e.PropertyType Is GetType(Boolean) Then
e.Cancel = True
End If
End Sub
End Class
Nota:
Los objetos de la coleccin deben implementar la interfaz INotifyPropertyChanged y la interfaz
IEditableObject para que DataGrid responda correctamente a los cambios y ediciones de
propiedad.
Cuando los elementos se agrupan en DataGrid, cada grupo tiene un encabezado. Puede cambiar el aspecto
de DataGridRowGroupHeader definiendo un Style personalizado y agregndolo a la coleccin
RowGroupHeaderStyles. Si dispone de varios niveles de agrupacin, puede aplicar estilos diferentes a cada
nivel de grupo. Los estilos se aplican en el orden en que se definen. Por ejemplo, si define dos estilos, el
primero se aplicar a los grupos de fila de nivel superior. El segundo estilo se aplicar a todos los grupos de
Cuando se agrupan los elementos en DataGrid, se pueden usar los mtodos siguientes para contraer y
expandir manualmente los grupos:
Haga clic en la flecha de contraer o expandir en el encabezado del grupo de la filas.
Haga doble clic en cualquier parte del encabezado de grupo.
Presione la tecla de direccin izquierda para contraer el grupo y la tecla de direccin derecha para
expandirlo cuando el encabezado tiene el foco.
Para contraer o expandir un grupo mediante programacin, pase CollectionViewGroup al mtodo
CollapseRowGroup o ExpandRowGroup.
Para contraer o expandir grupos de filas
1. Obtenga el objeto CollectionViewGroup que representa el grupo que se va a contraer o expandir.
Nota:
Puede obtener el objeto CollectionViewGroup mediante la coleccin Groups. Alternativamente,
puede usar el mtodo GetGroupFromItem para obtener un objeto CollectionViewGroup individual,
como se muestra aqu.
Ejemplo
En el ejemplo siguiente se muestra cmo agrupar, ordenar y filtrar los datos en un objeto
PagedCollectionView, adems de cmo mostrar los datos agrupados, ordenados y filtrados en un control
DataGrid. Una coleccin de objetos Task se encapsula en un objeto PagedCollectionView.
PagedCollectionView se usa como ItemsSource de DataGrid. La agrupacin, ordenacin y filtrado se realizan
en PagedCollectionView y se muestran en la interfaz de usuario de DataGrid.
<UserControl x:Class="DataGridGrouping.MainPage"
xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
Imports System.Collections.ObjectModel
Imports System.ComponentModel
Imports System.Windows.Data
Requisitos previos
Necesita los componentes siguientes para completar este tutorial:
Silverlight 4.
Silverlight 4 Tools para Visual Studio 2010.
Visual Studio 2010.
Este cdigo controla los eventos de cambio para los controles de interfaz de usuario de opciones
de DataGrid que agreg en la seccin anterior. Cuando se modifica una opcin, se establece la
propiedad DataGrid correspondiente.
' READ ONLY
Private Sub cbReadOnly_Changed(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
Dim cb As CheckBox = sender
If Me.dataGrid1 IsNot Nothing Then
Me.dataGrid1.IsReadOnly = cb.IsChecked
End If
End Sub
' FREEZE COLUMN
Private Sub cbFreezeColumn_Changed(ByVal sender As System.Object, ByVal e As
System.Windows.RoutedEventArgs)
Dim cb As CheckBox = sender
If Me.dataGrid1 IsNot Nothing Then
If cb.IsChecked = True Then
Me.dataGrid1.FrozenColumnCount = 1
ElseIf cb.IsChecked = False Then
Me.dataGrid1.FrozenColumnCount = 0
End If
End If
End Sub
' HIDE COLUMN
Private Sub cbHideColumn_Changed(ByVal sender As System.Object, ByVal e As
System.Windows.RoutedEventArgs)
Dim cb As CheckBox = sender
If Me.dataGrid1 IsNot Nothing Then
If cb.IsChecked = True Then
Me.dataGrid1.Columns(0).Visibility = Windows.Visibility.Collapsed
ElseIf cb.IsChecked = False Then
Me.dataGrid1.Columns(0).Visibility = Windows.Visibility.Visible
End If
End If
End Sub
' SELECTION MODE
Private Sub cbSelectionMode_Changed(ByVal sender As System.Object, ByVal e As
System.Windows.RoutedEventArgs)
Dim cb As CheckBox = sender
If Me.dataGrid1 IsNot Nothing Then
If cb.IsChecked = True Then
Me.dataGrid1.SelectionMode = DataGridSelectionMode.Single
ElseIf cb.IsChecked = False Then
Me.dataGrid1.SelectionMode = DataGridSelectionMode.Extended
End If
End If
End Sub
' COLUMN OPTIONS
Private Sub cbColReorder_Changed(ByVal sender As System.Object, ByVal e As
System.Windows.RoutedEventArgs)
Dim cb As CheckBox = sender
If Me.dataGrid1 IsNot Nothing Then
Me.dataGrid1.CanUserReorderColumns = cb.IsChecked
End If
End Sub
Private Sub cbColResize_Changed(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
Dim cb As CheckBox = sender
If Me.dataGrid1 IsNot Nothing Then
Me.dataGrid1.CanUserResizeColumns = cb.IsChecked
End If
End Sub
Private Sub cbColSort_Changed(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
Dim cb As CheckBox = sender
If Me.dataGrid1 IsNot Nothing Then
Me.dataGrid1.CanUserSortColumns = cb.IsChecked
End If
End Sub
' SCROLL BARS VISIBILITY
Private Sub cbVerticalScroll_Changed(ByVal sender As System.Object, ByVal e As
System.Windows.RoutedEventArgs)
Dim cb As CheckBox = sender
If Me.dataGrid1 IsNot Nothing Then
If cb.IsChecked = True Then
Me.dataGrid1.VerticalScrollBarVisibility = ScrollBarVisibility.Visible
ElseIf cb.IsChecked = False Then
Me.dataGrid1.VerticalScrollBarVisibility = ScrollBarVisibility.Hidden
Else
Me.dataGrid1.VerticalScrollBarVisibility = ScrollBarVisibility.Auto
Pasos siguientes
Normalmente, las propiedades de DataGrid se establecen en XAML si no tienen que establecerse
dinmicamente en tiempo de ejecucin. Si desea obtener la sintaxis XAML para establecer una propiedad,
vea la seccin Uso de atributos XAML de la documentacin de la propiedad de DataGrid.
Tambin puede personalizar un control DataGrid aplicando estilos y plantillas al mismo. Los estilos y
plantillas permiten personalizar el control an ms que estableciendo propiedades.
Dimensionar DataGrid
Precauciones cuando se utiliza el tamao automtico
De forma predeterminada, las propiedades Width y Height de DataGrid se establecen en Double.NaN
("Auto" en XAML) y DataGrid se ajustar al tamao de su contenido.
Cuando se coloca dentro de un contenedor que no restringe el tamao de sus elementos secundarios,
como Canvas o StackPanel, DataGrid se expandir ms all de los lmites visibles del contenedor y las barras
de desplazamiento no se mostrarn. Esta condicin tiene implicaciones de utilidad y rendimiento.
Cuando se enlaza un conjunto de datos, si Height de DataGrid no se restringe, continuar agregando una
fila para cada elemento de datos en el conjunto de datos enlazado. Esto puede hacer que DataGrid crezca
fuera de los lmites visibles de la aplicacin cuando se agreguen filas. DataGrid no mostrar las barras de
desplazamiento en este caso porque Height continuar creciendo para alojar las nuevas filas.
Se crea un objeto para cada fila de DataGrid. Si est trabajando con un conjunto de datos grande y permite
que DataGrid se dimensione automticamente, la creacin de un nmero grande de objetos puede afectar
al rendimiento de la aplicacin.
Para evitar estos problemas al trabajar con conjuntos de datos grandes, se recomienda que establezca
Height de DataGrid especficamente o que lo coloque en un contenedor que restrinja su Height, por
ejemplo, Grid. Cuando Height se restringe, DataGrid crear solo las filas que se ajusten a su Height
especificado y reciclar segn sea necesario esas filas para mostrar los nuevos datos.
Establecer el tamao de DataGrid
DataGrid se puede establecer para que se dimensione dentro de los lmites especificados automticamente
o DataGrid se puede establecer en un tamao concreto. En la siguiente lista se muestran las propiedades
que pueden establecerse para controlar el tamao de DataGrid.
Propiedad Descripcin
Height Establece un alto concreto para DataGrid.
Establece el lmite superior para el alto de DataGrid. DataGrid crecer verticalmente hasta que
MaxHeight
llegue a este alto.
Establece el lmite inferior para el alto de DataGrid. DataGrid disminuir verticalmente hasta que
MinHeight
llegue a este alto.
Width Establece un ancho concreto para DataGrid.
Establece el lmite superior para el ancho de DataGrid. DataGrid crecer horizontalmente hasta
MaxWidth
que llegue a este ancho.
Establece el lmite inferior para el ancho de DataGrid. DataGrid disminuir horizontalmente hasta
MinWidth
que llegue a este ancho.
Nombre Descripcin
El modo de ajuste de tamao automtico predeterminado ajusta el tamao de las columnas
Auto
de DataGrid en funcin del contenido de los encabezados de celda y columna.
El modo de ajuste de tamao automtico basado en celdas ajusta el tamao de las columnas
SizeToCells de DataGrid en funcin del contenido de las celdas en la columna, sin incluir los encabezados
de columna.
El modo de ajuste de tamao automtico basado en encabezados ajusta el tamao de las
SizeToHeader
columnas de DataGrid en funcin solamente del contenido de los encabezados de columna.
El modo de ajuste de tamao basado en pxeles dimensiona las columnas de DataGrid
Pixel
basndose en el valor numrico proporcionado.
El modo de ajuste de tamao mediante asterisco se usa para distribuir el espacio disponible
Star en proporciones ponderadas.
En el lenguaje XAML, los valores de asterisco se expresan como n*, donde n representa un
La clase DataGridLengthConverter se puede utilizar para convertir datos entre valores numricos o de
cadena y valores DataGridLength.
De manera predeterminada, la propiedad DataGrid.ColumnWidth se establece en Auto y la propiedad
DataGridColumn.Width es null. Cuando el modo de tamao se establece en Auto o SizeToCells, las
columnas crecern hasta el tamao de su contenido visible ms ancho. Al desplazarse, estos modos de
tamao harn que las columnas se expandan si el contenido que es mayor que el tamao de columna se
desplaza en la vista. La columna no se reducir cuando el contenido se desplace fuera de la vista.
Las columnas de DataGrid tambin se pueden establecer para dimensionarse automticamente solo dentro
de los lmites especificados, o las columnas se pueden establecer en un tamao concreto. En la siguiente
lista se muestran las propiedades que se pueden establecer para controlar el tamao de columna.
Propiedad Descripcin
DataGrid.MaxColumnWidth Establece el lmite superior de todas las columnas de DataGrid.
Establece el lmite superior de una columna individual. Invalida
DataGridColumn.MaxWidth
DataGrid.MaxColumnWidth.
DataGrid.MinColumnWidth Establece el lmite inferior de todas las columnas de DataGrid.
Establece el lmite inferior de una columna individual. Invalida
DataGridColumn.MinWidth
DataGrid.MinColumnWidth.
DataGrid.ColumnWidth Establece un ancho especfico para todas las columnas de DataGrid.
Establece un ancho especfico para una columna individual. Invalida
DataGridColumn.Width
DataGrid.ColumnWidth.
Cuadros de mensaje
Silverlight proporciona un objeto MessageBox que se puede utilizar para mostrar un mensaje y solicitar una
respuesta. Para mostrar un cuadro de mensaje, se llama al mtodo Show(String) esttico. De manera
opcional, se puede especificar un ttulo y un botn de cancelacin para el cuadro de mensaje mediante el
Si desea mostrar un cuadro de dilogo para abrir un archivo, puede usar el mtodo ShowDialog.
ShowDialog devuelve true si el usuario ha seleccionado un archivo y ha hecho clic en Abrir; devuelve false si
el usuario ha hecho clic en Cancelar. Tal y como se ha mencionado anteriormente, para que se muestre el
cuadro de dilogo, el usuario debe realizar alguna accin, por ejemplo, hacer clic en un botn.
La carpeta inicial que aparece la primera vez que se muestra el control OpenFileDialog de una aplicacin se
basa en la configuracin del usuario. En las siguientes presentaciones del control OpenFileDialog, se utiliza
la carpeta del ltimo archivo seleccionado. Por motivos de seguridad, no se puede especificar una carpeta
inicial para el control OpenFileDialog.
Es posible filtrar los tipos de archivo que se muestran en OpenFileDialog mediante la propiedad Filter. A
continuacin, se muestra un ejemplo de una configuracin de filtro.
Text Files (.txt)| *.txt"
Se puede habilitar al usuario para que pueda seleccionar varios archivos mediante la propiedad Multiselect.
Una vez seleccionados los archivos, es posible recuperar informacin sobre los mismos mediante la
propiedad File o Files, en funcin de que se hayan seleccionado uno o varios archivos.
En el siguiente ejemplo, se refleja cmo mostrar un control OpenFileDialog.
Private ofd As OpenFileDialog
Private Sub OpenButton_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
ofd = New OpenFileDialog()
ofd.Filter = "Text Files (.txt)| *.txt"
ofd.Multiselect = False
Dim result As System.Nullable(Of Boolean) = ofd.ShowDialog()
Para mostrar un cuadro de dilogo que permite guardar un archivo, se usa el mtodo ShowDialog.
ShowDialog devuelve true si el
si el usuario ha hecho clic en Guardar; devuelve false si el usuario ha hecho clic en Cancelar. Tal y como se
ha mencionado anteriormente, para que se muestre el cuadro de dilogo, el usuario debe realizar alguna
accin, por ejemplo, hacer clic en un botn.
De manera similar a lo que sucede con el control OpenFileDialog, es posible filtrar los tipos de archivo que
se muestran en el control SaveFileDialog mediante la propiedad Filter. Una vez especificada, la descripcin
del filtro aparece en la lista desplegable Guardar como tipo del cuadro de dilogo. A continuacin se
incluye un ejemplo de una descripcin de filtro.
Text Files (.txt)| *.txt"
Es posible especificar la extensin de archivo predeterminada que se anexa al archivo guardado mediante la
propiedad DefaultExt.
Para recuperar el nombre del archivo guardado, se usa la propiedad SafeFileName. Tal y como indica el
nombre de la propiedad, por razones de seguridad, SafeFileName devuelve nicamente el nombre del
archivo sin su ruta de acceso.
En el ejemplo de cdigo siguiente, se muestra cmo establecer la propiedad Filter y mostrar un control
SaveFileDialog.
Private sfd As SaveFileDialog
Private Sub SaveButton_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
sfd = New SaveFileDialog()
sfd.Filter = "Video Files (.wmv) | *.wmv"
para cancelar la operacin de impresin. En la ilustracin siguiente, se muestra un ejemplo del cuadro de
dilogo de impresin para Windows.
Imprimir (Cuadro de dilogo)
Para que se lleve a cabo la operacin de impresin, es preciso controlar el evento PrintPage del documento
de impresin y especificar el elemento que se desea imprimir.
La plantilla Ventana secundaria de Silverlight agrega al proyecto una nueva clase derivada de la ventana
secundaria, incluidos el archivo XAML y el archivo de cdigo subyacente. El archivo XAML contiene los
botones Aceptar y Cancelar y el archivo de cdigo subyacente contiene para cada botn los controladores
de eventos Click que establecen el resultado apropiado.
Control emergente
Es posible mostrar un control de usuario en un control Popup similar a un cuadro de dilogo. Para ello, se
crea un control de usuario derivado de la clase UserControl y se establece la propiedad Child de Popup en
una instancia del control de usuario. Para mostrar un objeto Popup, se establece la propiedad IsOpen en
true.
Para establecer la posicin de un objeto Popup con respecto a la esquina superior izquierda del
complemento Silverlight, se usan las propiedades VerticalOffset y HorizontalOffset.
Nota:
Si un archivo seleccionado se enva al servidor para su procesamiento, deber informar al usuario.
Para mostrar el cuadro de dilogo Abrir archivo y procesar las acciones del
usuario
1. Cree una instancia de la clase OpenFileDialog.
2. A ttulo opcional, especifique la cadena de filtro de archivos y el ndice del filtro estableciendo las
propiedades FilterIndex y Filter.
3. Llame al mtodo ShowDialog para que muestre el cuadro de dilogo Abrir archivo.
4. Cuando el mtodo devuelva el resultado, determine si el cuadro de dilogo se cerr con el botn
Aceptar o con el botn Cancelar. Si se cerr con el botn Aceptar, procese la seleccin del
usuario.
En el ejemplo siguiente se indica cmo mostrar el cuadro de dilogo, probar la seleccin del usuario y, a
continuacin, procesar el archivo.
<UserControl x:Class="SL_OpenFileDialog_VB.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="300">
<Grid x:Name="LayoutRoot" Background="White">
<Button x:Name="bOpenFileDialog" Content="Open File"
Height="30" Width="60" Margin="10"
HorizontalAlignment="Left" VerticalAlignment="Top"
Click="bOpenFileDialog_Click" />
<TextBox x:Name="tbResults" Text="Silverlight Results"
Height="30" Width="300" Margin="10,50"
Nota:
Los ensamblados y ejecutables deben ser ensamblados y ejecutables de Silverlight. Si se intentan
agregar controles de ensamblados que no son ensamblados ni ejecutables de Silverlight, aparecer
un cuadro de dilogo para indicar que no hay componentes para agregar al cuadro de
herramientas.
7. Los controles del ensamblado aparecen en el cuadro de dilogo Elegir elementos del cuadro de
herramientas.
8. Active la casilla situada junto al control que desee agregar y, a continuacin, haga clic en Aceptar.
El control seleccionado aparece en la parte inferior de la pestaa seleccionada en el Cuadro de
herramientas.
9. Desde el Cuadro de herramientas, arrastre el control hasta la superficie de diseo.
El control seleccionado se mostrar en la superficie de diseo. Adems, el ensamblado del control
se agrega como referencia de proyecto y se agrega al archivo XAML una asignacin de espacio de
nombres XAML.
Utilizar el diseador
Puede agregar un elemento de fichas a TabControl haciendo clic con el botn secundario en la superficie de
diseo.
Para agregar elementos de fichas a un TabControl utilizando el diseador
1. En Silverlight Designer, arrastre un control TabControl del cuadro de herramientas hasta la
superficie de diseo o seleccione un control TabControl existente. Cuando se arrastra un control
TabControl desde el cuadro de herramientas hasta la superficie de diseo, se agrega
automticamente TabItem al control.
2. En la parte superior del TabControl, haga clic con el botn secundario en TabItem.
3. Seleccione Agregar ficha del men contextual. En la siguiente ilustracin se muestra el men
contextual.
Nota:
De forma predeterminada, Silverlight Designer usa Grid como contenedor raz del elemento de
pestaa. Si necesita un contenedor raz diferente, puede eliminar Grid y agregar otro contenedor,
por ejemplo, un control StackPanel.
5.5.6. Cmo: Crear aplicaciones cuyo tamao pueda ser modificado por el
usuario con GridSplitter
Se puede usar el control GridSplitter junto con el control contenedor Grid para crear diseos cuyo tamao
pueda ajustar el usuario en tiempo de ejecucin. Por ejemplo, en una aplicacin que tiene una interfaz
dividida en reas, el usuario puede arrastrar un divisor para agrandar el rea que desee ver mejor. En este
tema, se incluyen algunos procedimientos recomendados de GridSplitter y se describe cmo crear un
control GridSplitter vertical y horizontal.
Cuando se agrega un control GridSplitter a un control Grid, el primero es un elemento secundario del
control Grid y debe colocarse en una fila y una columna como cualquier otro control secundario. El control
GridSplitter debe tener un ancho o alto distinto de cero, para que el usuario pueda agarrarlo y arrastrarlo en
tiempo de ejecucin.
Algunos procedimientos recomendados para GridSplitter incluyen los siguientes:
Coloque GridSplitter en una fila o columna dedicada que no contenga ningn otro control.
Establezca el alto de la fila o el ancho de la columna que contiene el GridSplitter en Auto.
Dedique un control Grid nico al control GridSplitter. Agregue paneles contenedores adicionales a
Grid para completar el diseo.
Nota:
En ocasiones, puede que sea difcil colocar filas y columnas en el diseador. En ese caso, puede
configurar Grid utilizando el editor XAML. Vea un ejemplo de marcado XAML en la seccin de
ejemplo al final de este tema.
Propiedad Valor
Grid.Column 0
Grid.RowSpan Nmero total de filas de Grid.
Ancho Un nmero distinto de cero. Por ejemplo: 10.
Alto Auto
HorizontalAlignment Right
VerticalAlignment Stretch
Margin 0
Nota:
En ocasiones, puede que sea difcil colocar filas y columnas en el diseador. En ese caso, puede
configurar Grid utilizando el editor XAML. Vea un ejemplo de marcado XAML en la seccin de
ejemplo al final de este tema.
Propiedad Valor
Grid.ColumnSpan Nmero total de columnas de Grid.
Grid.Row 0
Ancho Auto
Alto Un nmero distinto de cero. Por ejemplo: 10.
HorizontalAlignment Stretch
VerticalAlignment Bottom
Margin 0
Ejemplo
El siguiente XAML crea un control GridSplitter horizontal y otro vertical.
<Grid x:Name="LayoutRoot" Background="White" Height="400" Width="400" ShowGridLines="True">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="60" />
<RowDefinition Height="60" />
<RowDefinition Height="60" />
<RowDefinition Height="60" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="80" />
<ColumnDefinition Width="80" />
<ColumnDefinition Width="80" />
</Grid.ColumnDefinitions>
<sdk:GridSplitter Grid.Column="0" Grid.RowSpan="5" Width="10" HorizontalAlignment="Right" VerticalAlignment="Stretch" />
<sdk:GridSplitter Grid.Row="0" Grid.ColumnSpan="4" Height="10" HorizontalAlignment="Stretch" VerticalAlignment="Bottom"/>
<Rectangle Grid.Column="1" Fill="LightCoral" />
<Rectangle Grid.Row="1" Fill="LightBlue" />
</Grid>
Ejemplo
En el cdigo siguiente se muestra cmo controlar los eventos Checked y Indeterminate.
Private Sub HandleCheck(ByVal sender As Object, ByVal e As RoutedEventArgs)
Dim cb As CheckBox = CType(sender, CheckBox)
If (cb.Name = "cb1") Then
text1.Text = "Two state CheckBox checked."
Else
text2.Text = "Three state CheckBox checked."
End If
End Sub
Public Sub New(ByVal firstName As String, ByVal lastName As String, ByVal address As String)
Me.FirstName = firstName
Me.LastName = lastName
Me.Address = address
End Sub
End Class
Nota:
Asegrese de agregar una referencia al espacio de nombres local en el archivo XAML, como la que
figura a continuacin.
xmlns:src="clr-namespace:ListBoxSnippetEx"
<UserControl x:Class="ListBoxSnippetEx.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:src="clr-namespace:ListBoxSnippetEx" >
<Grid>
<Grid.Resources>
<src:Customers x:Key="customers"/>
</Grid.Resources>
<ListBox ItemsSource="{StaticResource customers}" Width="350" Margin="0,5,0,10">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Padding="5,0,5,0" Text="{Binding FirstName}" />
<TextBlock Text="{Binding LastName}" />
<TextBlock Text=", " />
<TextBlock Text="{Binding Address}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</UserControl>
Public Sub New(ByVal firstName As String, ByVal lastName As String, ByVal address As String)
Me.FirstName = firstName
Me.LastName = lastName
Me.Address = address
End Sub
End Class
End Class
' Handle the Populating event, but cancel it. Make the call to the web service.
Private Sub AutoCompleteBox_Populating(ByVal sender As Object, ByVal e As PopulatingEventArgs)
e.Cancel = True
CallToWebService()
End Sub
Ejemplo
En el ejemplo siguiente se muestran dos plantillas de datos jerrquicos declaradas en orden ascendente. En
el ejemplo se muestra un control TreeView con la propiedad ItemsControl.ItemTemplate establecida en la
plantilla que se aplica a los nodos de nivel superior.
Partial Public Class MainPage
Inherits UserControl
Public Shared Topics As New ObservableCollection(Of Topic)()
Public Sub New()
InitializeComponent()
5.5.11. InkPresenter
El elemento InkPresenter proporciona una superficie de dibujo que admite las caractersticas de entrada
manuscrita. InkPresenter se deriva de Canvas y puede mostrar uno o varios objetos UIElement y un objeto
StrokeCollection.
El uso de la entrada manuscrita en Silverlight abre nuevos escenarios para la interaccin natural en el
contenido de los juegos en lnea. Silverlight simplifica la implementacin de estos escenarios. La flexibilidad
del modelo de entrada permite a su vez una gran flexibilidad al implementarlo en el contenido de los
juegos.
En el ejemplo anterior, se agrega un Rectangle a Canvas con el mismo margen que el elemento
InkPresenter. Esto se debe a que InkPresenter no incluye propiedades para proporcionar lmites visuales. La
propiedad Stroke de Rectangle est establecida en Black, lo que hace que acte como borde de
InkPresenter. El orden Z de InkPresenter debe ser superior al de Rectangle. De lo contrario, Rectangle
ocultar InkPresenter.
Para anotar fotografas con un lpiz o un mouse, Image y InkPresenter se agregan a un elemento Canvas. En
el siguiente ejemplo de cdigo se muestra cmo anotar una fotografa.
<Canvas>
<Image Source="flower.jpg" Stretch="Fill" Width="500" Height="500" />
<InkPresenter x:Name="MyIP" Background="Transparent" Width="500" Height="500"
MouseLeftButtonDown="MyIP_MouseLeftButtonDown"
MouseMove="MyIP_MouseMove"
LostMouseCapture="MyIP_LostMouseCapture">
</InkPresenter>
</Canvas>
puede ser un punto, una lnea recta o una lnea curva. Cada Stroke contiene un objeto StylusPointCollection,
que a su vez contiene objetos StylusPoint individuales. Los objetos StylusPoint se recogen al mover el lpiz
mientras est en contacto con el digitalizador. Stroke tambin incluye una serie de caractersticas, como
alto, ancho, color y color del contorno, todas ellas incluidas en la clase DrawingAttributes.
Recopilacin de entradas manuscritas
Puede crear o capturar los trazos mediante programacin, respondiendo a los eventos en InkPresenter. Los
eventos tpicos para hacer esto son MouseLeftButtonDown, MouseMove y LostMouseCapture.
Nota:
Use los eventos del mouse para detectar las acciones de un dispositivo de lpiz. Los eventos
MouseLeftButtonDown, LostMouseCapture y MouseMove corresponden a acciones de descenso del lpiz,
movimiento y subida del lpiz, respectivamente.
En el siguiente ejemplo de cdigo se muestra cmo recoger y mostrar los datos de trazo en InkPresenter.
Public Sub New()
MyBase.New()
InitializeComponent()
SetBoundary()
End Sub
'A new stroke object, MyStroke, is created and is added to the StrokeCollection object of the InkPresenter, MyIP
Private Sub MyIP_MouseLeftButtonDown(ByVal sender As Object, ByVal e As MouseEventArgs)
MyIP.CaptureMouse()
Dim MyStylusPointCollection As StylusPointCollection = New StylusPointCollection
MyStylusPointCollection.Add(e.StylusDevice.GetStylusPoints(MyIP))
NewStroke = New Stroke(MyStylusPointCollection)
MyIP.Strokes.Add(NewStroke)
End Sub
'StylusPoint objects are collected from the MouseEventArgs and added to MyStroke.
Private Sub MyIP_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs)
If (Not (NewStroke) Is Nothing) Then
NewStroke.StylusPoints.Add(e.StylusDevice.GetStylusPoints(MyIP))
End If
End Sub
'MyStroke is completed
Private Sub MyIP_LostMouseCapture(ByVal sender As Object, ByVal e As MouseEventArgs)
NewStroke = Nothing
End Sub
'Set the Clip property of the inkpresenter so that the strokes are contained within the boundary of the inkpresenter
Private Sub SetBoundary()
Dim MyRectangleGeometry As RectangleGeometry = New RectangleGeometry
MyRectangleGeometry.Rect = New Rect(0, 0, MyIP.ActualWidth, MyIP.ActualHeight)
MyIP.Clip = MyRectangleGeometry
End Sub
Requisitos previos
En este tema se supone que el usuario entiende cmo obtener entradas de lpiz en un control InkPresenter.
Borrado de trazos
El borrado de trazos elimina trazos completos. Por ejemplo, un trazado de lpiz o de mouse que interseca
con un trazo puede iniciar un borrado de trazos. El borrado de trazos se puede implementar pasando la
coleccin StylusPointCollection obtenida por el trazado del mouse o el lpiz al mtodo HitTest de la
coleccin de trazos de lpiz. El valor devuelto indicar qu trazo se debe quitar de la coleccin.
En los pasos siguientes se describe cmo implementar un algoritmo de borrado de trazos. En este
algoritmo, el usuario hace clic con el mouse o con el lpiz y mueve el puntero sobre un trazo para borrarlo.
Para implementar el borrado de trazos
1. En el controlador de eventos MouseLeftButtonDown, obtenga los puntos del lpiz y almacnelos en
un objeto StylusPointCollection.
Private Sub _presenter_MouseLeftButtonDown(ByVal sender As Object, ByVal e As MouseButtonEventArgs)
If _mode = InkMode.StrokeErase Then
_erasePoints = e.StylusDevice.GetStylusPoints(_presenter)
End If
End Sub
Borrado de puntos
El borrado de puntos elimina nicamente una parte del trazo. La implementacin del borrado de puntos es
similar al borrado de trazos. Sin embargo, en el borrado de puntos, un trazo que interseca con el trazado
del mouse o del lpiz se reemplaza con dos trazos.
En los pasos siguientes se describe cmo implementar un algoritmo de borrado de puntos. En este
algoritmo, el usuario hace clic con el mouse o con el lpiz y mueve el puntero sobre un trazo para dividirlo
en dos.
Para implementar el borrado de puntos
1. En el controlador de eventos MouseLeftButtonDown, obtenga los puntos del lpiz y almacnelos en
un objeto StylusPointCollection. Almacene el ltimo punto del lpiz en la coleccin de puntos del
lpiz por separado. Guardar el ltimo punto permite asegurarse de que el punto en que se llam al
evento de clic del mouse se procese tambin en el controlador de movimiento de mouse
subsiguiente.
Private Sub _presenter_MouseLeftButtonDown(ByVal sender As Object, ByVal e As MouseButtonEventArgs)
If _mode = InkMode.PointErase Then
Dim pointErasePoints As StylusPointCollection = e.StylusDevice.GetStylusPoints(_presenter)
'Store the last point in the stylus point collection.
_lastPoint = pointErasePoints(pointErasePoints.Count - 1)
End If
End Sub
coleccin de trazos del elemento InkPresenter mediante el mtodo HitTest y almacene los trazos
que intersequen. Quite la interseccin de puntos entre el trazo y el trazado del mouse o del lpiz.
En el mtodo ProcessPointErase del paso siguiente se implementa la eliminacin de los puntos que
intersecan.
Private Sub _presenter_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs)
If _mode = InkMode.PointErase AndAlso _lastPoint IsNot Nothing Then
Dim pointErasePoints As StylusPointCollection = e.StylusDevice.GetStylusPoints(_presenter)
pointErasePoints.Insert(0, _lastPoint.Value)
'Compare collected stylus points with the ink presenter strokes and store the intersecting strokes.
Dim hitStrokes As StrokeCollection = _presenter.Strokes.HitTest(pointErasePoints)
If hitStrokes.Count > 0 Then
For Each hitStroke As Stroke In hitStrokes
'For each intersecting stroke, split the stroke into two while removing the intersecting points.
ProcessPointErase(hitStroke, pointErasePoints)
Next
End If
_lastPoint = pointErasePoints(pointErasePoints.Count - 1)
End If
End Sub
3. Implemente el mtodo ProcessPointErase para reemplazar el trazo que interseca con dos trazos. El
mtodo ProcessPointErase toma un objeto Stroke denominado stroke y una coleccin
StylusPointCollection denominada pointErasePoints como entrada y quita los puntos que
intersecan de InkPresenter. Determine la interseccin partiendo del primer punto en de stroke y
agregue cada punto del lpiz de stroke a splitStroke1 hasta llegar a un punto del lpiz que
interseque con pointErasePoints. Repita el proceso empezando por el ltimo punto de stroke y
agregue cada punto del lpiz a splitStroke2 hasta llegar a un punto del lpiz que interseque con el
objeto pointErasePoints de entrada. Por ltimo, reemplace stroke con splitStroke1 y splitStroke2.
Para ello, puede utilizar el mtodo remove y agregar splitstroke1 y splitstroke2 a InkPresenter.
Private Sub ProcessPointErase(ByVal stroke As Stroke, ByVal pointErasePoints As StylusPointCollection)
Dim splitStroke1 As Stroke, splitStroke2 As Stroke, hitTestStroke As Stroke
Modelo de contenido
RichTextBox admite un modelo de contenido basado en bloques. La propiedad de contenido del control
RichTextBox es Blocks, que es una coleccin de elementos Paragraph. El elemento Paragraph puede
contener elementos derivados de Inline. En la siguiente ilustracin, se resume el modelo de contenido del
control RichTextBox y se muestra cmo los elementos derivados de Block e Inline encajan en este modelo.
Diagrama del modelo de contenido de RichTextBox
Elementos de bloque
Los elementos de bloque son clases que heredan de Block. Actualmente, Paragraph y Section se derivan de
Block, pero Section no forma parte del modelo de documento de RichTextBox.
Elemento de
Descripcin
bloque
Paragraph se utiliza para agrupar el contenido en un prrafo. El uso ms sencillo y comn de
Paragraph Paragraph es crear un prrafo de texto. Un objeto Paragraph tambin puede contener
elementos incorporados.
Elementos incorporados
Los elementos incorporados son clases que heredan de Inline; un elemento incorporado est incluido en un
elemento de bloque u otro elemento incorporado. Los elementos incorporados se utilizan a menudo como
contenedor directo del contenido que se representa en la pantalla. Por ejemplo, un elemento de bloque
Paragraph puede contener un elemento incorporado Run, pero es Run el que contiene en realidad el texto
que se representa en la pantalla. El contenido de cada elemento Paragraph puede incluir muchos tipos de
elementos, incluidos los siguientes:
Elemento
Descripcin
incorporado
Run se utiliza para contener texto sin formato. Podra pensarse que el objeto Run se
Run utiliza en gran medida en el contenido; sin embargo, en el marcado no es necesario
utilizar los elementos Run de forma explcita.
Span agrupa otros elementos de contenido inline. No se aplica ninguna representacin
inherente al contenido dentro de un elemento Span. Es decir, no se da formato al
Span contenido si se coloca dentro de un elemento Span sin ningn atributo. Sin embargo, los
elementos que heredan de Span, como Hyperlink, Bold, Italic y Underline, aplican
formato al texto.
InlineUIContainer permite incrustar elementos UIElement (por ejemplo, controles Image
InlineUIContainer
o Button) en un elemento de contenido Inline.
A continuacin, se muestra cmo crear un control RichTextBox con un prrafo y texto en negrita en XAML y
en cdigo. El valor de la propiedad VerticalScrollBarVisibility se establece en Auto.
<!--A RichTextBox with intial content in it.-->
<RichTextBox VerticalScrollBarVisibility="Auto">
<Paragraph>
A RichTextBox with <Bold>initial content</Bold> in it.
</Paragraph>
</RichTextBox>
' Create a paragraph and add the Run and Bold to it.
Dim myParagraph As New Paragraph()
myParagraph.Inlines.Add(myRun1)
myParagraph.Inlines.Add(myBold)
myParagraph.Inlines.Add(myRun2)
Elementos como Paragraph y Bold determinan cmo aparece el contenido en el control RichTextBox.
Cuando un usuario edita el contenido de RichTextBox, modifica dicho contenido.
Hipervnculos
RichTextBox admite hipervnculos. Se puede usar el elemento Hyperlink para mostrar hipervnculos en el
control RichTextBox. Los hipervnculos proporcionan un comportamiento integrado al situar el mouse sobre
ellos as como compatibilidad con el foco. Utilice la propiedad NavigateUri del elemento Hyperlink para
especificar la direccin URL.
Nota:
Es preciso establecer la propiedad IsReadOnly del control RichTextBox en true para que funcione el
elemento Hyperlink.
A continuacin, se muestra cmo crear un control RichTextBox con un hipervnculo en XAML y en cdigo.
<!--A RichTextBox with hyperlink.-->
<RichTextBox IsReadOnly="True">
<Paragraph>
Displaying text with <Hyperlink NavigateUri="http://www.msdn.com">hyperlink</Hyperlink>.
</Paragraph>
</RichTextBox>
' Create a paragraph and add the Run and hyperlink to it.
Dim myParagraph As New Paragraph()
myParagraph.Inlines.Add(myRun)
myParagraph.Inlines.Add(MyLink)
Recorrer el contenido
Es posible recorrer el contenido de un control RichTextBox mediante la clase TextPointer y sus miembros.
Un objeto TextPointer representa una posicin en el contenido de un control RichTextBox. La posicin
puede encontrarse entre caracteres del contenido o entre las etiquetas de elemento que definen la
estructura del contenido. Si la posicin est entre caracteres del contenido, se trata de una posicin de
insercin. Es decir, se puede agregar nuevo contenido en esa posicin sin infringir ninguna regla semntica
para el contenido asociado. En la prctica, una posicin de insercin se puede encontrar en cualquier parte
del contenido donde se pueda colocar un cursor. En la mayora de los casos, si la posicin se encuentra
entre las etiquetas de elemento que definen la estructura del contenido, no se trata de una posicin de
insercin. Un ejemplo de una posicin de TextPointer vlida que no sea una posicin de insercin es la
posicin entre dos etiquetas de prrafo adyacentes (es decir, entre la etiqueta de cierre del prrafo anterior
y la etiqueta de apertura del prrafo siguiente).
Entre las operaciones que se pueden realizar con la clase TextPointer se encuentran las siguientes:
Realice una comparacin de ordinales de la posicin actual con una segunda posicin especificada.
Un escenario ms comn sera seleccionar una parte del contenido y, a continuacin, aplicar el formato a la
seleccin. La clase TextSelection representa una seleccin de texto en el control RichTextBox. Para obtener
acceso al texto seleccionado en el control RichTextBox, se usa su propiedad Selection. Para realizar
operaciones con el texto seleccionado, se pueden usar los mtodos GetPropertyValue y
ApplyPropertyValue. En el siguiente ejemplo, se muestra cmo aplicar formato de negrita, cursiva y
subrayado al texto seleccionado.
<!--Create a RichTextBox and three buttons.-->
<StackPanel>
<RichTextBox x:Name="MyRTB" Width="600" Height="400" />
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<Button Content="Bold" Height="30" Margin="2" Width="50" Click="BtnBold_Click" />
<Button Content="Italic" Height="30" Margin="2" Width="50" Click="BtnItalic_Click" />
<Button Content="Underline" Height="30" Margin="2" Width="65" Click="BtnUnderline_Click" />
</StackPanel>
</StackPanel>
Asimismo, existe la posibilidad de seleccionar texto mediante programacin. Para seleccionar texto
mediante programacin en un control RichTextBox, se usa el mtodo Select. El mtodo Select toma dos
objetos TextPointer como parmetros y selecciona el texto entre los dos objetos. En el siguiente ejemplo de
cdigo, se utiliza el mtodo Select para seleccionar y subrayar mediante programacin la ltima palabra de
un control RichTextBox. En este ejemplo, se usa un carcter de espacio para delimitar las palabras. Este
ejemplo de cdigo forma parte de un ejemplo ms extenso referente a la clase TextPointer.
'This method underlines the last word in a RichTextBox
Public Sub UnderlineLastWord()
Dim EndofContent As TextPointer = MyRTB1.ContentEnd.GetNextInsertionPosition(LogicalDirection.Backward)
Dim currentPointer As TextPointer = EndofContent.GetNextInsertionPosition(LogicalDirection.Backward)
If (currentPointer Is Nothing) Then
Return
End If
Dim currentChar As String = GetCurrentChar(MyRTB1, currentPointer, LogicalDirection.Backward)
While ((currentChar <> " ") _
AndAlso (currentChar <> ""))
currentPointer = currentPointer.GetNextInsertionPosition(LogicalDirection.Backward)
currentChar = GetCurrentChar(MyRTB1, currentPointer, LogicalDirection.Backward)
End While
If (currentChar = " ") Then
MyRTB1.Selection.Select(currentPointer.GetNextInsertionPosition(LogicalDirection.Forward), EndofContent)
Else
MyRTB1.Selection.Select(currentPointer, EndofContent)
End If
MyRTB1.Selection.ApplyPropertyValue(Run.TextDecorationsProperty, TextDecorations.Underline)
End Sub
Private Function GetCurrentChar(ByVal RTB As RichTextBox, ByVal pointer As TextPointer, ByVal direction As
LogicalDirection) As String
Dim nextPointer As TextPointer = pointer.GetNextInsertionPosition(direction)
If (Not (nextPointer) Is Nothing) Then
RTB.Selection.Select(pointer, nextPointer)
If (RTB.Selection.Text.Length <> 0) Then
Return RTB.Selection.Text(0).ToString
End If
End If
Return ""
End Function
XAML
Para obtener y establecer una representacin en XAML del contenido de un control RichTextBox, se usa la
propiedad Xaml. La cadena de XAML devuelta por la propiedad Xaml incluir solo los siguientes elementos:
Paragraph
Run
LineBreak
Span
Bold
Hyperlink
Underline
Italic
Nota:
Observe que la cadena de XAML devuelta por la propiedad Xaml no incluir ningn objeto UIElement del
contenido. Los objetos InlineUIContainer se convertirn en objetos Run vacos.
En la siguiente tabla, se muestran varios elementos y las correspondientes propiedades que se incluyen en
la cadena devuelta por la propiedad Xaml.
Elemento Propiedades
FontSize
FontFamily
Foreground
FontWeight
FontStyle
TextElement
FontStretch
Nota:
La propiedad Xaml solo admite valores de atributo que se pueden representar como una
cadena. Por ejemplo, para establecer la propiedad Foreground, solo se puede utilizar un
objeto SolidColorBrush y no un objeto LinearGradientBrush.
FlowDirection
Run
Text
Section HasTrailingParagraphBreakOnPaste
Block TextAlignment
TargetName
NavigateUri
Hyperlink
MouseOverForeground
MouseOverTextDecorations
Undo
El control RichTextBox permite realizar varias operaciones de reversin en respuesta a las acciones del
usuario. Adems, tambin se puede revertir una operacin de reversin, lo que se denomina rehacer.
Cuando se deshace o se rehace una accin, el control RichTextBox intenta establecer el estado de seleccin
basndose en esas operaciones.
La operacin de deshacer se admite nicamente si el valor de la propiedad IsReadOnly de un control
RichTextBox es false. Asimismo, las operaciones de reversin no se pueden realizar mediante programacin.
Elementos de texto
En trminos generales, un elemento de texto en Silverlight es:
Un control TextBlock.
Un Control diseado para mostrar texto o que incluye texto en alguna parte de su plantilla y
presentacin habituales, como un control TextBox o RichTextBox.
Una clase derivada de TextElement que se puede usar para aplicar formato al texto que se muestra
en un control TextBlock o RichTextBox.
Ciertos tipos especficos de los controles, como DataGridTextColumn.
Estos elementos comparten la caracterstica de tener un conjunto de propiedades que controlan cmo se
muestra el texto en el elemento o en el contenido del elemento. Estas propiedades son: FontFamily,
FontSize, FontStretch, FontStyle, FontWeight y Foreground. La implementacin de las propiedades no
necesariamente se comparte entre los elementos como parte de una herencia comn, pero las
implementaciones son similares en cada elemento de texto.
TextBlock
El objeto TextBlock es el elemento principal para mostrar texto de solo lectura en aplicaciones basadas en
Silverlight. En el XAML siguiente, se muestra cmo definir un elemento TextBlock y establecer su propiedad
Text en una cadena.
<TextBlock Text="Hello, world!" />
TextBlock tambin admite un modelo de texto bsico para su contenido, que se describe en la seccin
"Modelo de texto de TextBlock" en este mismo tema.
Controles de texto
TextBlock no es el nico elemento de la interfaz de usuario de Silverlight que muestra texto directamente.
TextBox, PasswordBox y RichTextBox tambin son elementos de texto. Estas clases se derivan de la clase
Control, que implementa varias propiedades pertinentes para el texto y las fuentes. Sin embargo, no
siempre es cierto que una clase derivada de Control sea capaz de mostrar texto o incluso admita un modelo
de contenido que pueda contener un elemento de texto. A continuacin, se muestra una lista con las
propiedades de texto y fuentes pertinentes que se implementan en la clase Control:
Control.FontFamily
Control.FontSize
Control.FontStretch
Control.FontStyle
Control.FontWeight
Por otra parte, aunque no se usa exclusivamente como una propiedad de fuente, Foreground proporciona
Brush para el texto mostrado en elementos de texto de Silverlight.
Herencia de propiedades de fuente en controles de texto
Uno de los motivos por los cuales las propiedades de fuente y texto se implementan en el nivel de Control
es que los controles puedan admitir la herencia de los valores de las propiedades de fuente. Esto permite
definir un control con componentes que procedan de una plantilla y hacer que las propiedades de fuente
del control primario se apliquen a cualquiera de los componentes o contenido que muestren cadenas de
texto.
Por ejemplo, ComboBox es un control de elementos en el que se pueden mostrar otros elementos o texto.
Si se establecen las propiedades de fuente de ComboBox, los otros elementos o el texto mostrado heredan
automticamente las propiedades de fuente (sin requerir ningn tipo de control especial por parte de la
lgica del control). En el caso del texto mostrado, la herencia de las propiedades de fuente es especialmente
til, porque no habra ninguna otra forma de aplicar atributos a ese texto. Los componentes y el contenido
de texto de un control personalizado pueden heredar sus propiedades de fuente basadas en Control
exactamente de la misma manera.
La herencia de las propiedades de fuente funciona cuando el componente es un control TextBlock. Esto es
as aunque TextBlock no es tcnicamente un control y no comparte las implementaciones de propiedad con
su control primario. Esa es una de las razones por las que son paralelas las propiedades de fuente entre los
controles y TextBlock.
Si se establecen las propiedades de los elementos de texto a travs de Style o una plantilla aplicada, los
elementos secundarios heredan las propiedades en tiempo de ejecucin. Los cambios en tiempo de
ejecucin de las propiedades de los elementos de texto tambin propagan sus nuevos valores a los
elementos de texto secundarios herederos.
En el XAML siguiente, se muestra cmo definir un elemento TextBlock y especificar todos los atributos de
fuente mostrados en la tabla anterior (salvo TextDecorations).
Nota:
Dependiendo de la fuente seleccionada por Silverlight, los atributos de fuente especificados pueden no ser
los que se utilizan durante la representacin. Para obtener ms informacin, vea la seccin "Seleccin de
fuentes" ms adelante en este mismo tema.
<TextBlock
Text="Font Attributes"
FontFamily="Verdana"
FontSize="36"
Fuentes en Silverlight
Las fuentes que se pueden usar en un equipo cliente dependen de la versin de Silverlight. En Silverlight 4,
se puede utilizar en el equipo cliente cualquier fuente para cualquier elemento de texto.
En Silverlight 3, se puede usar en el equipo cliente un subconjunto de las fuentes. Para los elementos de
texto en Silverlight 3, se pueden usar las siguientes fuentes latinas si estn disponibles en el equipo local.
Arial
Arial Black
Arial Unicode MS
Calibri
Cambria
Cambria Math
Comic Sans MS
Candara
Consolas
Constantia
Corbel
Courier New
Georgia
Lucida Grande/Lucida Sans Unicode
Segoe UI
Symbol
Tahoma
Times New Roman
Trebuchet MS
Verdana
Wingdings
Wingdings 2
Wingdings 3
Lucida Grande y Lucida Sans Unicode son alias de la misma fuente y se especifican como un par por
motivos de compatibilidad. Portable User Interface es una fuente compuesta. Usa varias fuentes para
implementar el intervalo de idiomas internacionales admitido por Silverlight. Entre estas se incluyen "Lucida
Sans Unicode" y "Lucida Grande" para muchos sistemas de escritura occidentales, as como muchas otras
para los sistemas de escritura de Asia Oriental.
Si desea trabajar con texto de Asia Oriental, los elementos de texto de Silverlight 3 pueden utilizar las
siguientes fuentes de Asia Oriental si estn disponibles en el equipo local:
Batang
Meiryo
MS Gothic
MS Mincho
MS PGothic
MS PMincho
PMingLiU
SimSun
En los equipos con Microsoft Windows, los elementos de texto de Silverlight 3 tambin pueden utilizar las
siguientes fuentes de Asia Oriental si estn disponibles en el equipo local:
BatangChe
DFKai-SB
Dotum
DutumChe
FangSong
GulimChe
Gungsuh
GungsuhChe
KaiTi
Malgun Gothic
Microsoft JhengHei
Microsoft YaHei
MingLiU
MingLiu_HKSCS
MingLiu_HKSCS-ExtB
MingLiu-ExtB
MS UI Gothic
NSimSun
NSimSun-18030
PMingLiu-ExtB
SimHei
SimSun-18030
SimSun-ExtB
Si Silverlight 3 se ejecuta en equipos Macintosh, los elementos de texto tambin pueden usar las siguientes
fuentes de Asia Oriental si estn disponibles en el equipo local:
AppleGothic
Gulim
Hiragino Kaku Gothic Pro
STHeiti
Seleccin de fuentes
La fuente que se especifica no tiene por qu ser la fuente que usa Silverlight. Silverlight elige la fuente entre
las fuentes locales compatibles, las fuentes proporcionadas en un archivo empaquetado al que se hace
referencia en la propiedad FontFamily, o el archivo. zip o .ttf basado en secuencia que se pasa a la
propiedad FontSource. El resultado que se muestra es la coincidencia ms adecuada en funcin de los
valores de las propiedades FontFamily, FontStretch, FontStyle y FontWeight. Es importante especificar estas
cuatro propiedades de fuente para garantizar que la seleccin de la fuente del elemento de texto sea
adecuada y coherente.
Especificacin de fuentes no predeterminadas
Silverlight no incluye ninguna fuente en su paquete de instalacin, sino que se basa en las fuentes locales
del sistema para obtener sus valores predeterminados. Si desea usar una fuente para un elemento de texto
que no se encuentra en la lista de fuentes locales admitidas, puede especificar la fuente en XAML mediante
la propiedad FontFamily o en el cdigo mediante la propiedad FontSource. La propiedad FontFamily puede
especificar un archivo de fuentes nico o un archivo zip que contenga los archivos de fuentes, y puede
incorporar una secuencia de reserva. Cualquier archivo de fuentes al que se haga referencia para el uso de
FontFamily en XAML se debe incrustar como recurso dentro de un ensamblado. Cuando se usa FontSource,
el cdigo puede cargar el archivo de fuentes de origen para la fuente (o un zip de fuentes) desde una
secuencia, como un almacenamiento aislado, o desde un empaquetado de XAP.
Un color slido no es la nica manera de aplicar un primer plano a una fuente. En Silverlight se puede usar
cualquiera de las clases derivadas de Brush, incluidas RadialGradientBrush, LinearGradientBrush, ImageBrush
y VideoBrush. Si especifica estos pinceles en XAML, debe usar la sintaxis de elementos de propiedad o una
referencia tal como una referencia de recurso. En el cdigo XAML siguiente se muestra un ejemplo de cmo
se usa la sintaxis de elementos de propiedad y cmo se especifica ImageBrush para el texto:
<TextBlock Text="SHRUBBERY">
<TextBlock.Foreground>
<ImageBrush ImageSource="forest.jpg"/>
</TextBlock.Foreground>
</TextBlock>
En la ilustracin siguiente, se muestra el texto con formato representado del XAML anterior.
TextBlock rendering multiple Run objects
LineBreak hace que el texto de cada Run se muestre en una lnea independiente. Sin LineBreak, el texto de
cada Run fluira junto, como una sola lnea, y a menudo quedara cortado, ya que se excedera el ancho del
objeto TextBlock o el ancho del rea de contenido de Silverlight. En la ilustracin siguiente se muestra cmo
se representara el texto con formato si no se utilizaran objetos LineBreak.
TextBlock que representa varios objetos Run sin objetos LineBreak
TextBox y PasswordBox
Silverlight incluye un control TextBox y el control PasswordBox derivado, en su conjunto bsico de controles.
El control TextBox se utiliza normalmente para capturar la entrada de texto de un usuario. El control
PasswordBox se utiliza normalmente en los escenarios de autenticacin. La principal diferencia entre estos
controles reside en que se muestran los caracteres que se escriben en un control TextBox y se ocultan los
caracteres que se escriben en un control PasswordBox.
Cuando un control TextBox tiene el foco del teclado o cuando el puntero del mouse se mueve sobre l, el
cursor cambia normalmente a IBeam. Este comportamiento se basa en las plantillas predeterminadas y se
puede modificar para cada instancia.
Ajuste del texto de TextBox
El control TextBox admite el ajuste de texto. De forma predeterminada, la propiedad TextWrapping se
establece en NoWrap. Sin ajuste de texto, si el texto escrito supera el valor explcito de Width o una
restriccin de ancho impuesta por un contenedor de diseo primario, se desplazar de forma que el cursor
siempre permanezca a la vista. Si se establece el valor de TextWrapping en Wrap, el texto no se desplazar
horizontalmente y se ajustar dentro del control TextBox. Sigue siendo posible que se den situaciones en las
que el texto de entrada no se vea si se supera el valor de Height o el alto de representacin efectivo del
control TextBox.
Texto multilnea de TextBox
TextBox puede admitir texto multilnea, si AcceptsReturn se establece en true. En este modo, la tecla
ENTRAR/RETORNO se registra como una nueva lnea. En este caso, cualquier carcter escrito para la lnea
nueva se incluye potencialmente en los valores de SelectedText o Text.
Modelo de seleccin de TextBox
TextBox incluye varias API relacionadas con las reas de texto seleccionadas:
Las propiedades SelectionBackground y SelectionForeground determinan cmo se muestra el rea
seleccionada.
La propiedad SelectedText obtiene el texto seleccionado y tambin puede establecerse.
Las propiedades SelectionStart y SelectionLength obtienen el intervalo de seleccin dentro del
control Text global, y se pueden establecer.
El evento SelectionChanged se produce cuando cambia el valor de SelectedText o SelectionStart.
De forma predeterminada, para seleccionar un texto, se arrastra el mouse o se mantiene presionado la tecla
MAYS mientras se presiona una de las teclas de direccin. Por esta y otras razones, el control TextBox a
veces administra y suprime algunos de los eventos de entrada generales, como MouseLeftButtonDown o
KeyDown de algunas teclas especficas. Esas teclas son las teclas que pueden mover el cursor, como las
teclas de direccin.
RichTextBox
RichTextBox es un control que permite mostrar o modificar contenido enriquecido, como prrafos,
hipervnculos e imgenes incorporadas.
estilo que afectan al elemento TextBox del control compuesto. AutoCompleteBox est disponible en las
bibliotecas de cliente del SDK de Silverlight.
ItemsControls
ItemsControl o HeaderedItemsControl incluye la capacidad de mostrar elementos de texto mediante
ranuras de contenido. El texto incluido en los elementos es solo una cadena de texto, y no admite la
aplicacin de estilos por separado o un modelo de objeto de texto. Sin embargo, se puede usar la
caracterstica de herencia de valores de propiedad de las propiedades de elementos de texto para
establecer los valores del elemento primario del control, que despus se aplica al texto de los elementos.
ComboBox tiene una funcionalidad similar (tambin es un control ItemsControl).
Popup, Tooltip
Popup se usa a menudo para mostrar texto, pero no tiene ninguna propiedad que tome una cadena. En su
lugar, tiene una propiedad Child que puede tomar cualquier UIElement. Normalmente, TextBlock se usa
como valor Child, se establece un valor Text y, opcionalmente, se aplican estilos al texto mediante las otras
propiedades de TextBlock.
ToolTip usa la propiedad adjunta ToolTipService.ToolTip para la posicin y se puede usar una cadena para
este valor sin ni siquiera incluir un elemento ToolTip en el cdigo XAML. De lo contrario, se debera
especificar un elemento de objeto ToolTip como valor de elemento de la propiedad ToolTipService.ToolTip.
Por ejemplo, se puede utilizar un control TextBlock y establecer su propiedad Text.
El contenido de Popup o ToolTip no heredarn las propiedades de elemento de fuente, ni siquiera del
elemento raz de la pgina XAML. Esto se debe a que se considera que estos objetos estn fuera del rbol
visual general de Silverlight cuando se muestran, y los valores de propiedad de los elementos de texto
heredan del rbol visual. Si desea aplicar estilos al texto de un control Popup o ToolTip, establezca los
atributos o aplique los estilos en un control TextBlock explcito que declare como contenido. De lo contrario,
el texto usar los valores predeterminados de la ranura de contenido, que son los valores predeterminados
de TextBlock.
la propagacin de los datos con cada pulsacin de tecla del usuario antes de que el usuario haya terminado
de escribir el texto.
Glyphs
La clase Glyphs tambin se usa para mostrar texto. Glyphs administra el texto en un nivel inferior que
TextBlock o TextBox. La clase Glyphs est pensada para tratar cada glifo en su contenido de texto como una
posible entidad independiente, con la capacidad de controlar por separado los desplazamientos de bloque
y otras caractersticas. En lugar de la propiedad Text, Glyphs tiene la propiedad UnicodeString. Glyphs no
tiene ningn valor predeterminado activo, ni siquiera para la familia de fuentes ni el tamao de fuente. Se
espera que los usuarios de Glyphs empaqueten un subconjunto del archivo de fuentes para un valor de
FontUri. En general, el modelo de Glyphs es muy prctico cuando se usan herramientas que generan los
tipos de informacin de texto de bajo nivel que la clase Glyphs puede utilizar.
Glyphs no se considera un elemento de texto para la herencia de los valores de propiedad de los elementos
de texto. Ninguna de las propiedades de Glyphs se alinea directamente con las propiedades de los
elementos de fuente, como FontFamily o FontSize, debido al diferente enfoque que tiene Glyphs con
respecto a la presentacin de texto.
WebBrowser
A partir de Silverlight 3, existe la posibilidad de crear aplicaciones Silverlight que se ejecutan fuera del
entorno de hospedaje del explorador. El control WebBrowser permite mostrar contenido HTML en este
entorno de hospedaje.
El control WebBrowser se puede agregar en XAML o en cdigo. De forma predeterminada, el control
WebBrowser no tiene tamao. Por consiguiente, es preciso especificar las propiedades Height y Width para
que el control se muestre en la aplicacin. Cuando se muestra el control WebBrowser en una aplicacin que
se ejecuta en el explorador, se ve un rectngulo con el alto y el ancho especificados en lugar del control.
El contenido HTML que se va a mostrar en el control WebBrowser se puede establecer de varias maneras.
Se puede llamar al mtodo NavigateToString y pasar una cadena que contenga el contenido HTML
que se desea mostrar.
Se puede establecer la propiedad Source en un identificador URI completo o relativo.
Se puede llamar al mtodo Navigate y pasar un identificador URI completo o relativo para el
contenido HTML que se desea mostrar.
Nota de seguridad:
Por razones de seguridad, asegrese de que el contenido HTML que se va a mostrar con el mtodo
NavigateToString proceda de un origen de confianza.
Adems, se puede llamar a los scripts en el contenido HTML llamando al mtodo InvokeScript y pasando el
nombre del script que se desea ejecutar. El script debe encontrarse en el contenido HTML cargado; de lo
contrario, se producir una excepcin.
Se puede usar el mtodo Notify del objeto Window.external para la comunicacin entre JavaScript en el
contenido HTML y el cdigo administrado. Cuando esto sucede, se produce el evento ScriptNotify.
En el ejemplo siguiente, se muestra cmo usar el mtodo InvokeScript y controlar el evento ScriptNotify. En
este ejemplo, se llama al mtodo InvokeScript, que a su vez invoca la funcin LoadSearch en el siguiente
HTML. El archivo HTML debe estar hospedado en el mismo dominio que la aplicacin de Silverlight.
Button1.IsEnabled = False
End Sub
No se permite girar, aplicar efectos ni crear controles WebBrowser parcialmente opacos. Adems, no se
puede utilizar el control WebBrowser para superponer contenido de Silverlight sobre contenido HTML. Para
estos escenarios, se debe utilizar WebBrowserBrush.
Nota:
Si desea utilizar el control WebBrowser en Silverlight Designer, deber agregarlo al Cuadro de
herramientas; para ello, haga clic con el botn secundario en el Cuadro de herramientas y seleccione Elegir
elementos.
WebBrowserBrush
WebBrowserBrush es un tipo de objeto Brush similar a VideoBrush. Sin embargo, en lugar de dibujar un rea
con contenido de vdeo, la dibuja con contenido HTML. Este contenido HTLM lo proporciona un control
WebBrowser. Al igual que con los dems pinceles, se puede utilizar un control WebBrowserBrush para
dibujar los siguientes elementos:
El relleno (Fill) de una forma, como Rectangle.
El contenido de la geometra de una forma Path.
Background de un Canvas.
Foreground de un TextBlock.
A diferencia de lo que sucede con los otros tipos de pinceles, el contenido del control WebBrowserBrush
debe actualizarse manualmente llamando al mtodo Redraw.
Para usar un control WebBrowserBrush, se crea un control WebBrowser y se establece su propiedad Source.
Se aplica el control WebBrowserBrush al objeto que se desea dibujar y se establece la propiedad
SourceName del objeto WebBrowserBrush en el nombre del control WebBrowser que se ha creado.
Si cambia el contenido del control WebBrowser, es preciso llamar al mtodo Redraw para actualizar el
control WebBrowserBrush. Adems, el usuario no puede interactuar con el contenido que se muestra con
un control WebBrowserBrush. En el siguiente ejemplo, se refleja cmo mostrar contenido con un control
Ejemplo
Este ejemplo de cdigo contiene un control WebBrowser denominado WB1 y un control WebBrowserBrush
denominado htmlBrush. La propiedad de origen del control WebBrowser est establecida en
http://www.bing.com. En cambio, el origen del control WebBrowserBrush est establecido en el control
WebBrowser.
Inicialmente, el control WebBrowserBrush est oculto y se muestra el control WebBrowser. Cuando el
usuario mueve el mouse, se oculta el control WebBrowser y se muestra el control WebBrowserBrush, con
una transformacin aplicada al pincel. Cuando el usuario hace clic en el contenido HTML, indicando que
desea interactuar con el HTML, se vuelve a mostrar el control WebBrowser y se oculta el control
WebBrowserBrush.
El contenido del control WebBrowserBrush se actualiza a intervalos regulares de modo que se mantenga
sincronizado con el control WebBrowser. En el siguiente ejemplo, se utiliza un objeto DispatcherTimer para
invocar Redraw en el control WebBrowserBrush cada 100 milisegundos.
Para probar este ejemplo, debe habilitar la aplicacin de modo que pueda ejecutarse fuera del explorador.
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Net
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Documents
Imports System.Windows.Input
Imports System.Windows.Media
Imports System.Windows.Media.Animation
Imports System.Windows.Shapes
Imports System.Windows.Threading
<UserControl x:Class="WebBrowserBrushEx.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="400" d:DesignWidth="412">
<Grid x:Name="LayoutRoot" Background="LightBlue" MouseMove="LayoutRoot_MouseMove" ShowGridLines="True">
<Grid.RowDefinitions>
<RowDefinition Height="40"/>
<RowDefinition />
</Grid.RowDefinitions>
<Grid.Resources>
<Storyboard x:Name="Spin" >
<DoubleAnimation
Storyboard.TargetName="myTransform"
Storyboard.TargetProperty="Angle"
From="0" To="360" Duration="0:0:5"
RepeatBehavior="Forever" />
</Storyboard>
</Grid.Resources>
<TextBlock Margin="5" Text="Right-click to install the out-of-browser application" />
<WebBrowser Grid.Row="1" Visibility="Visible" Name="WB1" Height="350" Width="350" Source="http://www.bing.com" />
<!-- Add Rectangle the same size as the WebBrowser control -->
<Rectangle Grid.Row="1" x:Name="brush" Width="350" Height="350" Visibility="Collapsed"
MouseLeftButtonDown="brush_MouseLeftButtonDown" >
<Rectangle.Fill>
<!-- Fill (set background) as an HTML Brush -->
<WebBrowserBrush x:Name="htmlBrush" SourceName="WB1"/>
</Rectangle.Fill>
<Rectangle.RenderTransform>
<RotateTransform x:Name="myTransform" Angle="45" CenterX="175" CenterY="175" />
</Rectangle.RenderTransform>
</Rectangle>
</Grid>
</UserControl>
Control personalizado
Los controles personalizados separan la lgica del aspecto visual. Un control personalizado se usa cuando
se desea que exista una clara separacin entre el aspecto visual y la lgica. De esta forma, los diseadores
pueden modificar el aspecto visual con posterioridad sin obtener acceso al cdigo ni modificarlo.
Las dos maneras de modificar el aspecto de un control personalizado son el uso de estilos y la modificacin
de plantillas (lo que tambin se conoce como cambio de aspecto visual).
Estilos
Los estilos son bsicamente una coleccin de valores de propiedad. El uso de estilos es una manera de
cambiar fcilmente las caractersticas visuales de un control.
Plantillas
Una plantilla es un archivo XAML que define el aspecto visual y el comportamiento visual de un control. Se
puede reemplazar completamente el aspecto del control si se modifica o reemplaza su control
ControlTemplate predeterminado. Se puede modificar ControlTemplate para agregar, reorganizar o eliminar
los elementos de un control. En la ilustracin siguiente se muestra una comparacin de dos botones. En el
primer botn se modifica un estilo y en el segundo se modifica ControlTemplate.
Contrato de control
Los controles personalizados mantienen una separacin estricta entre la lgica y los elementos visuales.
Aunque dicha separacin tiene ventajas, como la posibilidad de personalizar los elementos visuales sin
afectar a la lgica, puede ser complicado para los diseadores de controles saber qu elementos necesita el
control. Esto se logra a travs del contrato de control. Un contrato de control es un acuerdo entre los
elementos lgicos y visuales del control. Por lo general, un contrato de control se compone de:
Las propiedades visuales expuestas en la clase de control.
Los elementos previstos en la plantilla.
La lgica prevista asociada a los elementos de la plantilla.
Nota:
Se recomienda usar el modelo de elementos y estados para crear un control, aunque el tiempo de ejecucin
de Silverlight no lo requiere. Sin embargo, si desea que el control se abra y se represente correctamente en
Expression Blend, debe seguir el modelo de elementos y estados compatible.
Elementos
Los elementos son componentes con nombre que estn incluidos en la plantilla de control. La lgica del
control espera que estos elementos estn en la plantilla de control.
En la ilustracin siguiente se muestran los elementos del control ComboBox. El control ComboBox tiene
cinco elementos con nombre: ContentPresenter, ContentPresenterBorder, DropDownToggle, ScrollViewer y
Popup. A cada uno de ellos se obtiene acceso mediante el cdigo del control. Cuando se presiona
DropDownToggle, se abre el elemento Popup y muestra los elementos de ComboBox. Al hacer clic en un
elemento, se muestra en ContentPresenter.
Estados
Un estado visual es la manera en que se muestra el control en un estado determinado. Por ejemplo, en la
ilustracin siguiente se muestra cmo un botn tiene un color de fondo diferente en los estados Normal,
MouseOver y Pressed.
Grupos de estados
Los grupos de estados son un conjunto de estados mutuamente excluyentes. Los distintos grupos de
estados son ortogonales. Esto significa que un control puede encontrarse en dos estados diferentes al
mismo tiempo solo si los estados pertenecen a distintos grupos de estados.
Un control CheckBox tiene cuatro grupos de estados: CommonStates, CheckStates, FocusStates y
ValidationStates. Por consiguiente, CheckBox puede encontrarse en estado Normal y Checked al mismo
tiempo, porque estos estados pertenecen a distintos grupos de estados. Sin embargo, un control CheckBox
no puede encontrarse al mismo tiempo en estado Normal y Pressed, porque ambos estados pertenecen al
grupo CommonStates. En la ilustracin siguiente se muestran los grupos de estados CommonStates y
CheckStates de CheckBox.
Transiciones visuales
Las transiciones visuales representan el aspecto visual de un control cuando pasa de un estado a otro. En la
ilustracin siguiente, el color de fondo del control Button personalizado cambia gradualmente de ms claro
a ms oscuro a medida que pasa del estado MouseOver al estado Pressed.
En este tema se explica las distintas partes de la plantilla ControlTemplate, se muestra cmo se crea una
plantilla ControlTemplate simple para un control Button y se explica cmo entender el contrato de un
control para que pueda personalizar su aspecto. Dado que las plantillas ControlTemplate se crean en XAML,
puede cambiar un aspecto del control sin escribir ningn cdigo. En los ejemplos de este tema se muestra
el marcado XAML que se utiliza para personalizar el aspecto de Button. Para obtener el ejemplo completo
que se explica en este tema, vea Tutorial: Personalizar la apariencia de un botn mediante una plantilla
ControlTemplate. Tambin puede utilizar un diseador como Microsoft Expression Blend 2 Service Pack 1
para conseguir el mismo fin.
Requisitos previos
En este tema se supone que entiende la creacin y el uso de controles y estilos, como se describen en
Introduccin a los controles, y que conoce los fundamentos de personalizacin de controles que se explican
en Personalizacin de controles.
Nota:
Los conceptos descritos en este tema se aplican a los elementos que heredan de la clase Control, salvo
UserControl. No se puede aplicar una plantilla ControlTemplate a un control UserControl.
En el ejemplo siguiente se muestra cmo definir la plantilla ControlTemplate como un recurso y establecer
la propiedad Template en una referencia al recurso.
<StackPanel>
<StackPanel.Resources>
<ControlTemplate TargetType="Button" x:Key="newTemplate">
<!--Define the ControlTemplate here.-->
</ControlTemplate>
</StackPanel.Resources>
<Button Template="{StaticResource newTemplate}" Content="Button1"/>
</StackPanel>
Aunque estos tres mtodos son maneras vlidas de definir una plantilla ControlTemplate, probablemente lo
ms comn sea establecer la propiedad Template en un estilo Style. Cuando una plantilla ControlTemplate
est establecida en un estilo Style, tenga en cuenta que el estilo se limita a establecer la propiedad
Template del mismo modo que si fuera cualquier otra propiedad.
En la tabla se muestra solamente la lista de propiedades visuales heredadas de la clase Control. Aparte de
las propiedades de la lista anterior, un control puede heredar tambin las propiedades DataContext,
TextDecorations y Language del elemento de marco de trabajo primario.
Adems, si ContentPresenter se encuentra en la plantilla ControlTemplate de un control ContentControl,
ContentPresenter se enlazar automticamente a las propiedades Content y ContentTemplate. Igualmente,
un control ItemsPresenter que se encuentre en la plantilla ControlTemplate de un control ItemsControl se
enlazar automticamente a las propiedades ItemsPresenter y Items.
En el ejemplo siguiente se crean dos botones que utilizan la plantilla ControlTemplate definida en el
ejemplo anterior. En el ejemplo se establecen las propiedades Background, Foreground y FontSize para cada
botn. Establecer la propiedad Background surte efecto, porque est enlazada a plantilla en la plantilla
El control es responsable de definir los estados como parte de su contrato de control; esto se explica con
detalle en Personalizar otos controles entendiendo el contrato de control ms adelante en este mismo
tema. Los estados de un control se especifican mediante el atributo TemplateVisualStateAttribute, que se
coloca en la definicin de clase del control. TemplateVisualStateAttribute especifica el nombre del estado y
el nombre del grupo de estados al que pertenece el estado. En el ejemplo siguiente se muestran los estados
que se especifican para Button.
<TemplateVisualStateAttribute(Name:="Pressed", GroupName:="CommonStates")> _
<TemplateVisualStateAttribute(Name:="Focused", GroupName:="FocusStates")> _
<TemplateVisualStateAttribute(Name:="Normal", GroupName:="CommonStates")> _
<TemplateVisualStateAttribute(Name:="MouseOver", GroupName:="CommonStates")> _
<TemplateVisualStateAttribute(Name:="Disabled", GroupName:="CommonStates")> _
<TemplateVisualStateAttribute(Name:="Unfocused", GroupName:="FocusStates")> _
Public Class Button
Inherits ButtonBase
End Class
puede tener el foco incluso cuando el puntero del mouse no est encima de l, de modo que un control
Button en el estado Focused puede estar en cualquiera de los siguientes estados: MouseOver, Pressed o
Normal.
Los objetos VisualState se agregan los objetos VisualStateGroup. Los objetos VisualStateGroup se agregan a
la propiedad adjunta VisualStateManager.VisualStateGroups, que se establece en el objeto
FrameworkElement raz de la plantilla ControlTemplate. En el ejemplo siguiente se definen los objetos
VisualState para los estados Normal, MouseOver y Pressed, que se encuentran todos en el grupo
CommonStates. El estado Disabled y los estados del grupo FocusStates se omiten para que el ejemplo
resulte breve, pero se incluyen en el ejemplo completo que encontrar en Tutorial: Personalizar la apariencia
de un botn mediante una plantilla ControlTemplate.
<ControlTemplate TargetType="Button">
<Border x:Name="RootElement">
<VisualStateManager.VisualStateGroups>
<!--Define the states for the common states.
The states in the VisualStateGroup are mutually exclusive to
each other.-->
<VisualStateGroup x:Name="CommonStates">
<!--The Normal state is the state the button is in
when it is not in another state from this VisualStateGroup.-->
<VisualState x:Name="Normal" />
<!--Change the SolidColorBrush, BorderBrush, to red when the
mouse is over the button.-->
<VisualState x:Name="MouseOver">
<Storyboard>
<ColorAnimation Storyboard.TargetName="BorderBrush"
Storyboard.TargetProperty="Color" To="Red" />
</Storyboard>
</VisualState>
<!--Change the SolidColorBrush, BorderBrush, to Transparent when the
button is pressed.-->
<VisualState x:Name="Pressed">
<Storyboard >
<ColorAnimation Storyboard.TargetName="BorderBrush"
Storyboard.TargetProperty="Color" To="Transparent"/>
</Storyboard>
</VisualState>
<!--The Disabled state is omitted for brevity.-->
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Border.Background>
<SolidColorBrush x:Name="BorderBrush" Color="Black"/>
</Border.Background>
<Grid Background="{TemplateBinding Background}" Margin="4">
<ContentPresenter
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
Margin="4,5,4,4" />
</Grid>
</Border>
</ControlTemplate>
Se pueden tener varios objetos VisualTransition en un objeto VisualStateGroup que hace referencia al
mismo estado, pero se utilizarn en el orden que se especifica en la tabla anterior. En el ejemplo siguiente,
hay dos objetos VisualTransition. Cuando el control realiza la transicin del estado Pressed al estado
MouseOver, se utiliza el objeto VisualTransition que tiene establecidas las dos propiedades From y To.
Cuando el control realiza la transicin de un estado que no es Pressed al estado MouseOver, se utiliza el
otro estado.
<!--Take one half second to trasition to the MouseOver state.-->
<VisualTransition To="MouseOver" GeneratedDuration="0:0:0.5" />
<!--Take one hundredth of a second to transition from the
El objeto VisualStateGroup tiene una propiedad Transitions que contiene los objetos VisualTransition que se
aplican a los objetos VisualState de VisualStateGroup. Como autor de ControlTemplate, dispone de libertad
para incluir cualquier objeto VisualTransition que desee. Sin embargo, si las propiedades From y To se
establecen en nombres de estados que no pertenecen a VisualStateGroup, el objeto VisualTransition se
omite.
En el ejemplo siguiente se muestra el objeto VisualStateGroup de CommonStates. En el ejemplo se define
un objeto VisualTransition para cada una de las transiciones siguientes del botn.
Al estado Pressed.
Al estado MouseOver.
Del estado Pressed al estado MouseOver.
Del estado MouseOver al estado Normal.
<VisualStateGroup x:Name="CommonStates">
<!--Define the VisualTransitions that can be used when the control
transitions between VisualStates that are defined in the VisualStatGroup.-->
<VisualStateGroup.Transitions>
<!--Take one hundredth of a second to transition to the Pressed state.-->
<VisualTransition To="Pressed" GeneratedDuration="0:0:0.01" />
<!--Take one half second to trasition to the MouseOver state.-->
<VisualTransition To="MouseOver" GeneratedDuration="0:0:0.5" />
<!--Take one hundredth of a second to transition from the
Pressed state to the MouseOver state.-->
<VisualTransition From="Pressed" To="MouseOver" GeneratedDuration="0:0:0.01" />
<!--Take one and a half seconds to transition from the MouseOver state to the Normal state.
Have the SolidColorBrush, BorderBrush, fade to blue, then to yellow, and then to black in that time.-->
<VisualTransition From="MouseOver" To="Normal" GeneratedDuration="0:0:1.5">
<Storyboard>
<ColorAnimationUsingKeyFrames
Storyboard.TargetProperty="Color"
Storyboard.TargetName="BorderBrush"
FillBehavior="HoldEnd" >
<ColorAnimationUsingKeyFrames.KeyFrames>
<LinearColorKeyFrame Value="Blue" KeyTime="0:0:0.5" />
<LinearColorKeyFrame Value="Yellow" KeyTime="0:0:1" />
<LinearColorKeyFrame Value="Black" KeyTime="0:0:1.5" />
</ColorAnimationUsingKeyFrames.KeyFrames>
</ColorAnimationUsingKeyFrames>
</Storyboard>
</VisualTransition>
</VisualStateGroup.Transitions>
<!--The remainder of the VisualStateGroup is the same as the previous example.-->
<VisualState x:Name="Normal" />
<VisualState x:Name="MouseOver">
<Storyboard>
<ColorAnimation Storyboard.TargetName="BorderBrush"
Storyboard.TargetProperty="Color" To="Red" />
</Storyboard>
</VisualState>
<VisualState x:Name="Pressed">
<Storyboard >
<ColorAnimation Storyboard.TargetName="BorderBrush"
Storyboard.TargetProperty="Color" To="Transparent"/>
</Storyboard>
</VisualState>
<!--The Disabled state is omitted for brevity.-->
</VisualStateGroup>
En el ejemplo siguiente se muestra un objeto ControlTemplate simplificado para ComboBox que incluye los
elementos especificados por los objetos TemplatePartAttribute en la clase ComboBox.
<ControlTemplate TargetType="ComboBox">
<Grid>
<Border x:Name="ContentPresenterBorder">
<Grid>
<ToggleButton x:Name="DropDownToggle"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
Margin="-1" HorizontalContentAlignment="Right">
<Path x:Name="BtnArrow" Height="4" Width="8"
Stretch="Uniform" Margin="0,0,6,0" Fill="Black"
Data="F1 M 300,-190L 310,-190L 305,-183L 301,-190 Z " />
</ToggleButton>
<ContentPresenter x:Name="ContentPresenter" Margin="6,2,25,2">
<TextBlock Text=" " />
</ContentPresenter>
</Grid>
</Border>
<Popup x:Name="Popup">
<Border x:Name="PopupBorder"
HorizontalAlignment="Stretch" Height="Auto"
BorderThickness="{TemplateBinding BorderThickness}"
BorderBrush="Black" Background="White" CornerRadius="3">
<ScrollViewer x:Name="ScrollViewer" BorderThickness="0" Padding="1">
<ItemsPresenter/>
</ScrollViewer>
</Border>
</Popup>
</Grid>
</ControlTemplate>
Para los controles que se distribuyen con Silverlight 4, encontrar en el tema de referencia de control el
elemento visual y los estados incluidos en el contrato de control. Por ejemplo, en la seccin Sintaxis de la
referencia de la clase ComboBox se muestran los objetos TemplatePartAttribute y
TemplateVisualStateAttribute que el control ComboBox especifica. Aunque la aplicacin debera ejecutarse
sin iniciar ninguna excepcin si no se incluye un objeto FrameworkElement o VisualState esperado, es
posible que el control no se comporte segn lo esperado. Cualquier propiedad pblica que afecta
visualmente al control tambin forma parte del contrato de control.
En el ejemplo siguiente se resume el contrato de control del botn.
<TemplateVisualState(Name:="Normal", GroupName:="CommonStates")> _
<TemplateVisualState(Name:="MouseOver", GroupName:="CommonStates")> _
<TemplateVisualState(Name:="Pressed", GroupName:="CommonStates")> _
<TemplateVisualState(Name:="Disabled", GroupName:="CommonStates")> _
<TemplateVisualState(Name:="Unfocused", GroupName:="FocusStates")> _
<TemplateVisualState(Name:="Focused", GroupName:="FocusStates")> _
Public Class Button
Inherits ButtonBase
Al crear una plantilla ControlTemplate, con frecuencia resulta ms fcil empezar con una plantilla
ControlTemplate existente y modificarla. Para cambiar una plantilla ControlTemplate existente, puede
realizar uno de los procedimientos siguientes:
Utilizar un diseador como Microsoft Expression Blend, que proporciona una interfaz grfica de
usuario para crear plantillas de control.
Obtener la plantilla ControlTemplate predeterminada y editarla.
Para crear una plantilla ControlTemplate correctamente, debe entender el contrato del control de que se
trate. Si se comprenden los elementos de un contrato de control, es posible crear una plantilla
ControlTemplate nueva para los controles existentes, y crear una aplicacin con una apariencia exclusiva.