Seguimos con la segunda parte sobres las novedades que nos llegan con la nueva versión 5 de Silverlight.
Enlace a datos
En Silverlight 5 dispondremos de plantillas
de datos (Data Templates) implícitas,
que nos permitirán asociar un plantilla de
datos a un tipo de datos concreto; tendremos
por fin entre nosotros a Ancestor
RelativeSource, que a partir de una plantilla
nos permitirá establecer un enlace a datos a una propiedad del elemento que lo contiene, algo
muy necesario y vital para todo tipo de aplicaciones; dispondremos
de extensiones de marcado (Markup Extensions)
personalizables, lo que nos permitirá crear mediante
código extensiones personalizadas para, por ejemplo,
añadir localización; y, finalmente, podremos realizar enlace
a datos en los setters de estilos.
Plantillas de datos implícitas
Silverlight 5 ofrece plantillas de datos implícitas, que
nos permiten asociar una plantilla de datos a un tipo de
datos; es decir, elegir cómo se presenta un tipo de datos
concreto en base a éste. Como ejemplo, crearemos una
colección de entidades de tipo IPersona, que implementaremos
en dos clases diferentes, Geek y MVP. A continuación,
enlazamos la colección para ser visualizada
en el siguiente ListBox:
<ListBox HorizontalAlignment="Stretch"
Margin="10,10,10,10"
Name="listBox1"
VerticalAlignment="Stretch"
ItemsSource="{Binding ocPersonas}" />
Si ejecutamos ahora la aplicación sin asignar plantillas
de datos a los tipos, lo que visualizaremos será la
representación predeterminada de la clase, resultado de
aplicar el método ToString(), como podemos ver en la
figura 7.
Para generar una visualización adecuada, podemos
crear dos plantillas de datos, una para el tipo Geek y otra
para el tipo MVP. Básicamente, las plantillas de datos ahora
tienen una nueva propiedad DataType, a la que se puede
asociar el tipo de datos al que se debe aplicar. Agregando
las dos plantillas que se muestran en el listado 8
y sin cambiar un ápice el código XAML del ListBox, obtendremos una presentación completamente diferente,
como se puede observar en la figura 8.
Listado 8
<DataTemplate DataType="idc:Geek">
<StackPanel Orientation="Horizontal">
<TextBlock>[GEEK!] - Nombre:</TextBlock>
<TextBlock Text="{Binding Nombre}"></TextBlock>
<TextBlock Text=" | Especialidad: "></TextBlock>
<TextBlock Text="{Binding Especialidad}"></TextBlock>
</StackPanel>
</DataTemplate>
<DataTemplate DataType="idc:MVP">
<StackPanel Orientation="Horizontal" Background="Yellow">
<TextBlock>[MVP!!] - Nombre: </TextBlock>
<TextBlock Text="{Binding Nombre}"></TextBlock>
<TextBlock Text=" | Especialidad: "></TextBlock>
<TextBlock Text="{Binding Especialidad}"></TextBlock>
</StackPanel>
</DataTemplate>
Nota: En Silverlight 5 dispondremos de plantillas
de datos implícitas, que nos permitirán asociar
un plantilla de datos a un tipo de datos
concreto.
Ancestor RelativeSource
Hasta ahora, la propiedad RelativeSource de los
bindings solo permitía Self y TemplatedParent, pero al
ampliarse con una nueva opción, Ancestor, nos acercamos
bastante al modelo de enlace a datos de WPF,
algo muy positivo. Un ejemplo de ello se puede ver en
el listado 9.
Listado 8
<DataTemplate>
<TextBox Width="{Binding Width
RelativeSource={RelativeSource
AncestorType=Border,
AncestorLevel=5}}" />
</DataTemplate>
Extensiones de marcado
En cuanto a las extensiones de marcado,
éstas fundamentalmente nos permiten
ejecutar código durante la interpretación
del código XAML, tanto para
propiedades como para manejadores de
eventos, lo que las hace ideales para mejorar
arquitecturas MVVM. Con Silverlight
4 teníamos cinco tipos diferentes:
- Binding
Text="{Binding Path=FirstName,Mode=TwoWay}"
- StaticResource
Foreground="{StaticResource BlueSolidColor}"
- TemplateBinding
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
- NullExtension
Background="{x:Null}"
- RelativeSource DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}"
La implementación de nuevas extensiones
de marcado es realmente directa y
requiere una simple derivación de la clase
System.Windows.Markup.MarkupExtension:
sobreescribir el método ProvideValue.
A observar, que el nombre de toda clase
que herede de MarkupExtension deberá
finalizar con "Extension", de forma similar
a lo que ocurre con la denominación de
las propiedades de dependencia.
Una implementación de una extensión
muy sencilla la podemos ver en el listado
10. Un posible uso en de ella en XAML sería:
<TextBlock FontSize="18" Margin="10"
Text="{lcl:ss Text='hola dnm'}">
</TextBlock>
Listado 10
public class ssExtension: MarkupExtension
{
public String Text { get; set; }
public override object ProvideValue(IServiceProvider serviceProvider)
{
return Text.ToUpper();
//return "Hi from the extension";
}
}
Enlace a datos en los setters de estilos
Por último, queda resaltar el novedoso
uso de bindings en los setters de estilos, ya
que, fundamentalmente, nos permitirán referenciar otras propiedades, como podemos
ver en el código XAML del listado 11.
Listado 11
<Style x:Key="TextBlockStyle2" TargetType="TextBlock">
<Setter Property="FontFamily"
Value="/SL5;Component/Fonts/Fonts/.zip#Segoe UI/>
<Setter Property="FontSize" Value="0,3,0,0"/>
<Setter Property="Foreground"
Value="{Binding Source={StaticResource SysColors},
Path=ControltextBrush}"/>
</Style>
Nota: La implementación de nuevas extensiones de marcado
es realmente directa y solo requiere una simple
derivación de la clase System.Windows.Markup.
MarkupExtension
Controles
En lo relativo a los controles, se ofrecen
varias mejoras generales, como la propiedad
ClickCount, que nos ayuda a detectar un doble clic de manera muy fácil.
El listado 12 nos muestra cuán sencillo es
utilizar esta nueva propiedad. Por otro
lado, Silverlight 5 ofrece soporte para múltiples
ventanas, que nuestra aplicación
podrá mostrar y permitir interactuar con
ellas de forma simultánea, en el caso de
las aplicaciones OOB (Out-Of- Browser),
que se ejecutan fuera del navegador.
Listado 12
private void OnMouseDownClickCount(object sender, MouseButtonEventArgs e)
{
if (e.ClickCount == 1)
{
// Single click occurred
}
if (e.ClickCount == 1)
{
// Double click occurred
}
if (e.ClickCount == 1)
{
// Triple click occurred
}
}
Gráficos 3D
Una de las demostraciones más espectaculares del Silverlight
Firestarter del pasado diciembre fue la relativa
a las capacidades 3D. En este caso no se trata de una
mejora, característica o funcionalidad, sino de una API
totalmente nueva que añade, literalmente, una nueva
dimensión a Silverlight.
En cualquier caso, tenemos ante nosotros una innovadora
API 3D, acelerada por GPU, que nos proporciona
las capacidades necesarias para construir avanzadas
visualizaciones y experiencias de usuario.
Aplicaciones de confianza
Algunas características de las aplicaciones de confianza
se permiten ahora en el navegador sin que éstas deban
ser instaladas, obviamente requiriendo que el fichero
XAP disponga de permisos elevados en su seguridad.
Las aplicaciones que se ejecuten fuera del navegador
(OOB) podrán acceder al sistema de ficheros del usuario
(hasta ahora, solo podían acceder a la carpeta Mis
Documentos). También se ha añadido soporte de interoperabilidad
COM y llamadas P/Invoke para aplicaciones
de confianza.
Y aún hay más…
- Una mejorada latencia de red mediante un interesante
cambio en la arquitectura, utilizando un hilo en background
para las funciones de red.
- Un parser de XAML mejorado que acelera el arranque,
así como la ejecución de Silverlight en general.
- Soporte para sistemas operativos de 64 bits.
- Impresión vectorial.
- Aceleración por hardware en el modo "sin ventana"
(windowless) en Internet Explorer 9.
- Conciencia de la energía, para poder decidir acciones
como no poner el equipo en hibernación o mitigar la
pantalla si se está viendo una película.
- Mejoras en el control PivotViewer.
Conclusiones
Nos hemos dejado en el tintero presentar en mayor detalle
algunas de las novedades en Silverlight 5, pero es que
son realmente muchas; hasta podríamos decir que algunas
de ellas, como las capacidades 3D de Silverlight 5,
se merecen uno o más artículos completos. En cualquier
caso, animo desde aquí al lector a investigar y probar
esas nuevas características, que en poco tiempo estarán
totalmente a nuestra disposición.