La plantilla Domain Service Class no existe en Silverlight 3

Comenzado a desarrollar proyectos en el mundo de las R.I.A para Silverlight 3, en uno de los pasos de configuración inicial necesito añadir una nueva plantilla Domain Service Class a mi proyecto Web. La sorpresa con la que me encuentro es que esta plantilla no existe en ninguna sección.

 1

Buceando entre las posibles soluciones encuentro la definitiva. Debido a que el idioma establecido por defecto en Visual Studio 2008 es en español. Esta circunstancia se produce debido a que si tenemos instalado el sistema operativo en dicho idioma, lo tomará por defecto en el entorno de desarrollo, por tanto no aparecerá la correspondiente plantilla.

Para ello debo de situarme en Visual Studio 2008 Herramientas->Opciones->Entorno->Configuración Internacional. En la sección Idioma, tiene el valor «Igual que en Microsoft Windows» o «español».

 2

Tengo que cambiar el idioma a English. Debo reiniciar Visual Studio2008.

 3

De este modo logro que la plantilla Domain Service Class aparezca y pueda incluirla en mi aplicación R.I.A .

 4

 

Depurar los elementos visuales de WPF con SNOOP

Los desarrolladores que nos dedicamos a la creación de aplicaciones basadas en Windows Presentation Foundation, se nos plantea la siguiente duda ¿cómo depuro los elementos visuales de mi aplicación? Yo he descubierto gracias a Oskar Alvarez , la herramienta SNOOP. Dicha herramienta la podréis descargar aquí. Una vez instalemos y ejecutemos la aplicación podremos ver que está desarrollada en WPF.

 1

Snoop se encarga de realizar una búsqueda de las distintas aplicaciones que están siendo ejecutadas en nuestro equipo bajo la plataforma WPF. Seleccionaremos la aplicación que necesitemos depurar. Seguidamente seleccionaremos el icono representado por unos prismáticos, con ello desplegando el árbol visual de los distintos elementos que componen la aplicación WPF.

 2

 3

De este modo podemos desplazarnos por cada uno de los elementos, ver sus propiedades y eventos y los valores de las mismos, simplemente accediendo a las correspondientes pestañas. También Snoop nos ofrece la opción de búsqueda de un determinado elemento, o la posibilidad de ver los errores de enlaces de datos de los diferentes elementos visuales.

La caracteristica en si más llamativa y funcional es la visualización de cualquier elemento que seleccionemos del arbol de Snoop, mostrandonos la ubicación del mismo dentro de expression Blend.

 4

Si seleccionamos la opción de control de errores en el enlace datos podemos ver los diferentes eventos que se utilizan en la aplicación. Mostrando si estos son correctos el color verde sobre el evento y color rojo si el evento contiene algún error así como el tipo de error que está ocurriendo.

 5

Como podemos observar esta herramienta es bastante completa a la hora de realizar la depuración de elementos visuales, ya que ofrece muchas opciones y un gran nivel de detalle de las mismas.

Liberar el consumo de memoria en el proceso de Hibernación de máquinas virtuales

Cada día son más las empresas que usan máquinas virtuales para implementar sus aplicaciones. Al realizar el proceso de hibernación, la memoria disponible se reduce considerablemente. La causa de este problema es que cada vez que el equipo virtual hiberna, crea un fichero hiberfil.sys. Este archivo recoge el estado de la maquina ocupando todo el tamaño de la memoria física, si disponemos de 2 Gb de memoria el archivo hiberfil.sys ocupará dicho tamaño. Guardando toda la información en el disco duro. Las máquinas virtuales en las que es necesario realizar un Backup, este proceso puede resultar pesado e innecesario mover este tipo de archivos.

Para solucionarlo tenemos dos caminos:

  1. El camino largo es entrar en

     

    Inicio->Panel de control

     

    Hacemos clic en Opciones de Energía

     

    Hacemos clic en la pestaña de Hibernación

     

    Desmarcar la casilla de selección "habilitar hibernación"

     

    Hacer clic en Aceptar y otra vez clic en Aceptar.

     

  2. El camino corto es

    Abrir una consola de comandos con permisos de Administrador e introducir la siguiente instrucción powercfg /h off

De este modo al reiniciar la máquina el archivo hiberfil.sys será automáticamente eliminado.

Configurar Silverlight 3 en nuestro servidor SharePoint

Para empezar a desarrollar y utilizar Silverlight 3 debemos descargar los siguientes componentes:

  1. Silverlight 3 Windows Developer Runtime y presionamos sobre Windows Runtime como podemos observer en al imagen.

     

     1

     

  2. Silverlight 3 SDK, solo está disponible en inglés por lo que deberemos de disponer de Visual Studio en el correspondiente idioma.

Si además queremos desarrollar aplicaciones de Silverlight 3 en el servidor, tendremos que descargarnos e instalar los siguientes componentes:

  1. Silverlight 3 Tools para Visual Studio 2008 SP1 con este complemento nos será de ayuda en la parte de desarrollo del proyecto.
  2. Microsoft Expression Blend 3 + SketchFlow, si lo que queremos es una herramienta que nos facilite el diseño de aplicaciones deberemos instalar el citado elemento.
  3. Microsoft .NET RIA Services proporciona un patrón para la escritura lógica de la aplicación que se ejecuta en el nivel intermedio y controla el acceso a datos para las consultas, los cambios y operaciones personalizadas.
  4. Documentación de Microsoft Silverlight 3 sin conexión.

Ahora vamos a pasar a configurar nuestro servidor SharePoint para que se puedan ejecutar aplicaciones de Silverlight 3.

  1. Vamos a acceder al SDK de Silverlight 3 para obtener la System.Web.Silverlight.dll que es necesaria en nuestro servidor SharePoint. Esta se encuentra en c:Program FilesMicrosoft SDKsSilverlightv3.0LibrariesServer 
  2. Para ejecutar dicha dll debemos ejecutar el siguiente comando GACUTIL /if «C:Program FilesMicrosoft SDKsSilverlightv3.0LibrariesServerSystem.Web.Silverlight.dll» en una consola de comandos.

Si en el servidor no disponemos de Visual Studio 2008 deberemos realizar las siguientes acciones:

  1. Accederemos a el archivo web.config de Sharepoint utilizando el explorador de Windows, generalmente está situado en C:Archivos de programaArchivos comunesMicrosoft Sharedweb server extensions12CONFIG.
  2. Hacemos una copia de seguridad del web.config para poder recuperar el original en cualquier momento.
  3. Dentro del web.config nos situaremos en la secciones <configuration> y después en <configSections>, añadiendo:

    <sectionGroup name=«system.web.extensions« type=«System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35«>

    <sectionGroup name=«scripting« type=«System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35«>

    <section name=«scriptResourceHandler« type=«System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35« requirePermission=«false« allowDefinition=«MachineToApplication«/>

    <sectionGroup name=«webServices« type=«System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35«>

    <section name=«jsonSerialization« type=«System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35« requirePermission=«false« allowDefinition=«Everywhere« />

    <section name=«profileService« type=«System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35« requirePermission=«false« allowDefinition=«MachineToApplication« />

    <section name=«authenticationService« type=«System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35« requirePermission=«false« allowDefinition=«MachineToApplication« />

    <section name=«roleService« type=«System.Web.Configuration.ScriptingRoleServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35« requirePermission=«false« allowDefinition=«MachineToApplication« />

    </sectionGroup>

    </sectionGroup>

     

  4. Dentro de la sección <assemblies> perteneciente al area <compilation> añadiremos el siguiente código:

    <add assembly=«System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089«/>

    <add assembly=«System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35«/>

    <add assembly=«System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089«/>

    <add assembly=«System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089«/>

    <add assembly=«System.Web.Silverlight, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35« />

     

  5. Dentro de las etiquetas <system.web>..<pages>..<controls> introducimos el siguiente código:

    <add tagPrefix=«asp« namespace=«System.Web.UI« assembly=«System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35«/>

    <add tagPrefix=«asp« namespace=«System.Web.UI.WebControls« assembly=«System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35«/>

    <add tagPrefix=asp namespace=«System.Web.UI.SilverlightControls« assembly=«System.Web.Silverlight, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35« />

     

  6. En <system.web>..<httpHandlers> incluimos:

    <remove verb=«*« path=«*.asmx«/>

    <add verb=«*« path=«*.asmx« validate=«false« type=«System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35«/>

    <add verb=«*« path=«*_AppService.axd« validate=«false« type=«System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35«/>

    <add verb=«GET,HEAD« path=«ScriptResource.axd« type=«System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35« validate=«false«/>

     

  7. Por último en <system.web><httpModules> añadimos:

    <add name=«ScriptModule« type=«System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35«/>

     

  8. Solo para la utilización IIS 7 añadiremos en siguiente código en la sección
    <configuration>:

     

    <system.webServer>

    <validation validateIntegratedModeConfiguration=«false«/>

    <modules>

    <remove name=«ScriptModule« />

    <add name=«ScriptModule« preCondition=«managedHandler« type=«System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35«/>

    </modules>

    <handlers>

    <remove name=«WebServiceHandlerFactory-Integrated«/>

    <remove name=«ScriptHandlerFactory« />

    <remove name=«ScriptHandlerFactoryAppServices« />

    <remove name=«ScriptResource« />

    <add name=«ScriptHandlerFactory« verb=«*« path=«*.asmx« preCondition=«integratedMode« type=«System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35«/>

    <add name=«ScriptHandlerFactoryAppServices« verb=«*« path=«*_AppService.axd« preCondition=«integratedMode« type=«System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35«/>

    <add name=«ScriptResource« preCondition=«integratedMode« verb=«GET,HEAD« path=«ScriptResource.axd« type=«System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35« />

    </handlers>

    </system.webServer>10. Add an AssemblyBinding element to the <configuration>

    <runtime>

    node: <assemblyBinding xmlns=«urn:schemas-microsoft-com:asm.v1«>

    <dependentAssembly>

    <assemblyIdentity name=«System.Web.Extensions« publicKeyToken=«31bf3856ad364e35«/>

    <bindingRedirect oldVersion=«1.0.0.0-1.1.0.0« newVersion=«3.5.0.0«/>

    </dependentAssembly>

    <dependentAssembly>

    <assemblyIdentity name=«System.Web.Extensions.Design« publicKeyToken=«31bf3856ad364e35«/>

    <bindingRedirect oldVersion=«1.0.0.0-1.1.0.0« newVersion=«3.5.0.0«/>

    </dependentAssembly>

     

    </assemblyBinding>

     

 

 

 

Al trabajar con IIS 7 evitamos la configuración de los MIME TYPE. Por otro lado si utilizamos versiones anteriores, tenemos que configurar manualmente cada Web Application en la raíz de IIS siguiendo estos pasos:

 

  1. Abrir el IIS.
  2. Presionamos con el botón derecho sobre la raíz de nuestra aplicación web
  3. Activa la casilla HTTP HEADERS.

    2


     

  4. Haremos clic en el botón MIME TYPES.

    3


     

  5. Presionaremos sobre NUEVO.

    4


     

  6. Para definir un nuevo MIME TYPE la extensión la deberemos configurar como .xap y el tipo será application/x-silverlight.

    5


     

  7. Para guardar los diferentes cambios presionamos en el botón OK

 

 

 

Utilizando los Pixel Shaders de WPF en Silverlight 3

Windows Presentation Foundation a partir del Framework 3.5 SP1 nos ofrece una serie de efectos Pixel Shaders. Vamos a provechar esta funcionalidad para aplicarla a Silverlight 3.

Lo primero que debemos hacer es descargar la última versión de WPF-FX, esta aplicación se compone de una serie de ejemplos y librerías basadas en los pixel Shaders que utilizaremos más adelante.

Abrimos un nuevo proyecto de Silverlight 3 con Visual Studio. Presionamos con el botón derecho del ratón sobre la solución situada en el explorador de soluciones. Seleccionamos añadir y proyecto existente.

 1

El proyecto que hemos descargado con anterioridad en codeplex es el que tenemos que añadir al actual proyecto. Este estará situado en WPFSLFx->SL-> SLShaderEffectLibrary-> SLShaderEffectLibrary.csproj.

Seguidamente tenemos que agregar la correspondiente librería (SLShaderEffectLibrary.dll) para poder utilizar los distintos efectos WPF. Para ello nos situamos en el explorador de soluciones, presionamos con el botón derecho sobre referencias, luego añadir referencia. En la ventana emergente, seleccionamos proyectos y encontraremos la citada librería.

 2

Para empezar a trabajar con la librería debemos referenciarla a través de el código behind, en mi caso C#. Para ello nos situamos en MainPage.Xaml.cs y lo referenciamos como se muestra en la imagen:

 3

Una vez realizados todos estos pasos, abrimos el proyecto con Expression Blend 3, podemos añadir una serie de imágenes. Seleccionando cualquier imagen, en el área de propiedades. En la sección de apariencia, añadiremos un nuevo efecto presionando sobre el botón nuevo de la propiedad efecto. En la ventana emergente expandiremos la librería SLShaderEffectLibrary.dll y elegimos el efecto deseado.

 4

De este modo ampliamos los escasos dos efectos que Silverlight 3 incorpora (Blur y Shadow). Otorgando con ello un efecto diferente a los controles y no solo a imágenes como en versiones anteriores de Silverlight, como podemos ver en la siguiente imagen:

5

Elegir diferentes fuentes en WPF

Si queremos dar un paso más, otorgando un añadido a la aplicación que estamos desarrollando, podemos dar diferentes formatos de texto a un informe, cartas, currículos etc… Para mostrar esta característica voy a elaborar una simple aplicación en la que introduciremos un texto y podremos elegir las diferentes fuentes, así como cambiar el texto a negrita o cursiva.

 1

El texto original en el que voy a realizar los diferentes cambios, cada uno de estos valores cambiará gracias a la utilización de elemento Binding que obtendrá los valores de los dos combo Box.

<TextBox FontFamily="{Binding ElementName=ElegirFuente,Path=SelectedValue}"

<!—Toma la fuente de el Item elegido en el Combo Box de Fuentes"ElegirFuentes"–>

FontWeight="{Binding ElementName=FormatoFuentes,Path=SelectedValue.Weight}"

FontStretch="{Binding ElementName=FormatoFuentes,Path=SelectedValue.Stretch}"

FontStyle="{Binding ElementName=FormatoFuentes,Path=SelectedValue.Style}"/>

<!—El formato de la letra es obtenido del Item selccionado del segundo Combo Box–>

 

El combo Box de elección de las diferentes fuentes se cargará de estas a través de la propiedad estática del Framework Fonts.SystemFontFamilies. Cada uno de los Items tomará su fuente de la citada propiedad, Tomando cada uno de los ítems la fuente correspondiente. De este modo ya puedo ver los diferentes Items formateados dándome una elección del tipo de letra más sencilla.

<ComboBox x:Name=" ElegirFuente "

ItemsSource="{Binding Source={x:Static Member=Fonts.SystemFontFamilies}}">

<ComboBox.ItemTemplate>

<DataTemplate>

<!—Se crea una plantilla para la presentación de los diferentes fuentes–>

<TextBlock FontFamily="{Binding .}" Text="{Binding Source}"/>

</DataTemplate>

</ComboBox.ItemTemplate>

</ComboBox>

 

El segundo Combo Box se encargará de dar formato a nuestra fuente (cursiva, negrita, etc.), este formato lo obtendrá de la propiedad estática FamilyTypefaces

<ComboBox

x:Name="FormatoFuentes"

ItemsSource="{Binding ElementName= FormatoFuentes,Path=SelectedValue.FamilyTypefaces}">

<ComboBox.ItemTemplate>

<DataTemplate>

<ListBox ItemsSource="{Binding AdjustedFaceNames}">

<ListBox.ItemTemplate>

<DataTemplate>

<TextBlock Text="{Binding Value}"/>

</DataTemplate>

</ListBox.ItemTemplate>

</ListBox>

</DataTemplate>

</ComboBox.ItemTemplate>

</ComboBox>

 

Como podéis observar la aplicación de las distintas fuentes y sus correspondientes formatos no requiere un gran esfuerzo de desarrollo, por el contrario si otorga una mayor calidad a nuestras aplicaciones.

Gráficas en Silverlight 3

La representación de datos de una forma atractiva a la par que funcional, es uno de las metas que Microsoft viene logrando en los últimos años. Además de las conocidas formas de creación de graficas del paquete ofimático de Office, ofreciéndonos un plus en cuanto a interfaz se refiere en su última versión. Ahora Microsoft nos ofrece la posibilidad de crear diversas gráficas en Silverlight 3.

Para empezar debemos de descargar el Silverlight 3 Toolkit, para más tarde crear una nueva aplicación Silverlight 3. La interfaz de usuario la elaboraremos a través de Page.xaml introduciendo en siguiente código:

 

<UserControl

    xmlns=»http://schemas.microsoft.com/winfx/2006/xaml/presentation»

    xmlns:x=»http://schemas.microsoft.com/winfx/2006/xaml»

    xmlns:chartingToolkit=»clr-namespace:System.Windows.Controls.DataVisualization.Charting;

assembly=System.Windows.Controls.DataVisualization.Toolkit» xmlns:d=»http://schemas.microsoft.com/expression/blend/2008″ xmlns:mc=»http://schemas.openxmlformats.org/markup-compatibility/2006″

    x:Class=»piechart.MainPage»

    Width=»640″ Height=»480″ mc:Ignorable=»d»>

 

<Grid x:Name=»LayoutRoot» Background=»White»>

<Grid.RowDefinitions>

<RowDefinition Height=»50″ />

<RowDefinition Height=»*» />

</Grid.RowDefinitions>

<TextBlock Text=»Cursos Microsoft»

Margin=»20,10,0,0″

Grid.Row=»0″

FontFamily=»Georgia»

FontSize=»18″

Foreground=»Blue» />

<chartingToolkit:Chart x:Name=»ActivityChart»

Margin=»20″

Grid.Row=»1″>

<chartingToolkit:Chart.Series>

<chartingToolkit:PieSeries Title=»Primer Trimestre»

IndependentValueBinding=»{Binding Name

DependentValueBinding=»{Binding Value}» />

</chartingToolkit:Chart.Series>

</chartingToolkit:Chart>

</Grid>

</UserControl>

Como podemos observar, he incluido un control para crear gráficos sectoriales, dentro del cual hay una serie que tiene dos propiedades una independiente y otra dependiente de los valores que se mostrarán en los diferentes sectores.

Seguidamente crearemos una nueva clase que la llamaremos Cursos en la que debemos tener en cuenta tres propiedades Name que es utilizada en el valor independiente, Value que es usada en el valor dependiente y Activities que devuelve la lista de Objetos de la clase Cursos.

using System;

using System.Net;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Documents;

using System.Windows.Ink;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Animation;

using System.Windows.Shapes;

using System.Collections.Generic;

 

namespace piechart

{

public class cursos

{

public string Name { get; set; }

 

public double Value { get; set; }

 

// Lista de objetos de cursos

 

public static List<cursos> Activities

 

{

 

get

 

{

 

// se crear la lista de 5 elementos

 

    // cada valor del elemento es un número aleatorio entre o y 1 que la suma de los 5 elementos suman 1

var percentages = FillPercentages(5);

 

var activitiesList = new List<cursos>()

 

{

new cursos() {Name = «WPF», Value = percentages[0]},

 

new cursos() {Name = «Silverlight 3», Value = percentages[1]},

 

new cursos() {Name = «SharePoint», Value = percentages[2]},

 

new cursos() {Name = «Windows 7», Value = percentages[3]},

 

new cursos() {Name = «Windows Server 2008 R2», Value = percentages[4]}

 

};

 

return activitiesList;

    // devuelve la lista de objetos con sus correspondientes valores

 

}

 

}

 

 

private static List<Double> FillPercentages(int numDoubles)

 

{

 

var pctgs = new List< Double >();

 

var r = new Random();

 

double total = 0.0;

 

 

 

for (int i = 0; i < numDoubles-1;)

 

{

 

 

double val = r.NextDouble();

 

if ( val + total < 1.0)

{

 

pctgs.Add(val);

 

++i;

}

 

}

 

pctgs.Add( 1.0 – total ); // valor final

 

return pctgs;

 

}

 

}

}

Seguidamente nos situaremos en el código behind de nuestro proyecto MainPage.xaml.cs, donde debemos unir la propiedad ItemSource de nuestro objeto grafico «PieChart» con la propiedad Activities de la clase cursos. De este modo se sincronizarán los datos introducidos en la lista, con los sectores que nos mostrará la aplicación en pantalla.

using System;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Documents;

using System.Windows.Ink;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Animation;

using System.Windows.Shapes;

using System.Windows.Controls.DataVisualization.Charting;

using System.Windows.Threading;

namespace piechart

{

    public partial class MainPage : UserControl

    {

        public MainPage()

        {

            InitializeComponent();

Animate();

        }

private void Animate()

 

{

 

var timer = new DispatcherTimer();

 

timer.Start(); // temporizador que llamará cada 4 segundos a el método FillPie

// cambiará los correspondientes valores

 

timer.Tick +=

 

( ( s, args ) => FillPie() );

 

timer.Interval = new TimeSpan( 0, 0, 4 ); //intervalo de 4 segundos

 

timer.Start();

 

}

private void FillPie()

 

{

 

var cs = ActivityChart.Series[0] as PieSeries;

 

if ( cs != null )

 

{

 

// genera los datos y los incluye en la propiedad del objeto    

// utilizado para crear la gráfica sectorial

 

 

cs.ItemsSource = cursos.Activities;

 

}

 

else

 

{

 

throw new InvalidCastException( «Expected Series[0] to be a column» );

 

}

 

}

}

}

La introducción de este último código será la llave para que nuestra aplicación represente una gráfica sectorial, que cambia durante un periodo de tiempo, siendo que la lectura y compresión de los datos que queremos mostrar se haga de una forma sencilla y ágil

Funcionalidades que no se ejecutan correctamente en Virtual PC 2007

A la hora de trabajar con máquinas virtuales, Virtual PC 2007 es una herramienta que soluciona muchas facetas de este campo. Pero a la hora de instalar dicha herramienta parece que todo funciona de forma correcta. Te descargas la última versión, creas la correspondiente máquina virtual. A la hora de empezar a trabajar con ella te encuentras, que muchas de las características que solías tener en versiones anteriores no funcionan, como por ejemplo el funcionamiento del ratón dentro de la ventana de nuestra máquina, el poder arrastrar elementos al escritorio, cambiar el tamaño de la ventana a nuestro antojo etc. Cómo podemos solucionar este pequeño inconveniente, al descargar la versión más reciente, también te descargas un complemento importante Virtual Machine Additions, dicho añadido lo podemos encontrar en forma de ISO en C:Program FilesMicrosoft Virtual PCVirtual Machine Additions. El paso que debemos ejecutar es iniciar el sistema operativo de la correspondiente máquina virtual, seguidamente ir a las opciones de configuración de la ventana de nuestra máquina virtual. Seleccionaremos Cd-> Capturar imagen ISO para después navegar hasta la ruta indicada con anterioridad e instalar el complemento citado.

De este modo Virtual Machine Additions añade las siguientes características:

  • Drag and drop
  • Folder sharing
  • Integrated mouse
  • Optimized video drivers
  • Time synchronization
  • Clipboard sharing
  • Improved operating system performance
  • Dynamic resizing of the virtual machine window, which automatically adjusts the size of the guest operating system desktop
  • Sound driver compatible with Windows Vista

 

Introducir el control SaveFileDialog en Silverlight 3

En la siguiente entrada voy a describir la inclusión de una utilidad de uso frecuente, el SaveFileDialog, en una aplicación web creada con Silverlight 3.

Empezaré con la creación de los controles con los que va interactuar el usuario. En este caso son un botón, que ejercerá de desencadenante de la acción descrita con anterioridad y un TextBlock que se encargará de mostrar los posibles mensajes de error.

<UserControl

x:Class=»SaveDialog.MainPage»

xmlns=»http://schemas.microsoft.com/winfx/2006/xaml/presentation»

xmlns:x=»http://schemas.microsoft.com/winfx/2006/xaml»

xmlns:navigation=»clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation»

xmlns:uriMapper=»clr-namespace:System.Windows.Navigation;assembly=System.Windows.Controls.Navigation»

xmlns:d=»http://schemas.microsoft.com/expression/blend/2008″ xmlns:mc=»http://schemas.openxmlformats.org/markup-compatibility/2006″

mc:Ignorable=»d» d:DesignWidth=»640″ d:DesignHeight=»480″>

 

<Canvas x:Name=»LayoutRoot» Background=»White»>

<Button x:Name=»btnSaveFile» Width=»100″ Height=»20″

Content=»Guardar Archivo» Click=»btnSaveFile_Click»

Canvas.Top=»10″ Canvas.Left=»10″></Button>

<TextBlock x:Name=»tblError» Canvas.Top=»40″ Canvas.Left=»10″></TextBlock>

</Canvas>

 

</UserControl>

El código que cobra una verdadera importancia es el siguiente código Behind:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Net;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Animation;

using System.Windows.Shapes;

using System.IO;

using SaveDialog.FilesServiceReference;

 

namespace SaveDialog

{

public partial class MainPage : UserControl

{

#region Fields

private SaveFileDialog dialog;

#endregion

 

#region Constructors

public MainPage()

{

InitializeComponent();

 

this.dialog = new SaveFileDialog();

 

try

{

this.dialog.DefaultExt = «.txt»;

this.dialog.Filter = «Archivos de Texto|*.txt|Archivos de Registro|*.log|Todos los Archivos|*.*»;

this.dialog.FilterIndex = 2;

}

catch (Exception ex)

{

this.tblError.Text = «Error al configurar el SaveFileDialog: « + ex.Message;

}

}

#endregion

 

#region Handlers

private void btnSaveFile_Click(object sender, RoutedEventArgs e)

{

bool? dialogResult = this.dialog.ShowDialog();

 

if (dialogResult == true)

{

try

{

FilesServiceReference.FilesClient fileClient

= new FilesClient();

fileClient.GetFileCompleted

+= new EventHandler<GetFileCompletedEventArgs>(

fileClient_GetFileCompleted);

fileClient.GetFileAsync();

 

this.tblError.Text = «Opteniendo Archivo desde el Servidor…»;

}

catch (Exception ex)

{

this.tblError.Text = «Error de llamada al Servicio: « + ex.Message;

}

}

}

void fileClient_GetFileCompleted(object sender, GetFileCompletedEventArgs e)

{

try

{

byte[] fileBytes = e.Result as byte[];

 

using (Stream fs = (Stream)this.dialog.OpenFile())

{

fs.Write(fileBytes, 0, fileBytes.Length);

fs.Close();

 

this.tblError.Text = «El Archivo ha sido guardado correctamente!»;

}

}

catch (Exception ex)

{

this.tblError.Text = «Error Al obtener el resultado: « + ex.Message;

}

}

#endregion

 

}

}

¿Demasiado código que no entiendes? Tranquilo, como puedes observar, he reseñado las partes que son pieza clave en este conjunto de código y te las voy a explicar detalladamente.

Para que mi aplicación se ponga en marcha lo primero es crear una instancia de la clase SaveFileDialog:

private SaveFileDialog dialog;

Seguidamente tengo que tenerlo incializado en el constructor.

this.dialog = new SaveFileDialog();

Ahora voy a cambiar algunas de las propiedades originales del objeto SaveFileDialog del siguiente modo:

this.dialog.DefaultExt = «.txt»;

this.dialog.Filter = «Archivos de Texto|*.txt|Archivos de Registro|*.log|Todos los Archivos|*.*»;

this.dialog.FilterIndex = 2;

 

La primera propiedad que he modificado es la extensión del archivo que guardará por defecto,en este caso .txt.La segunda propiedad,es el filtro que va aplicar nuestro control, a la hora de visualizar los archivos que mi equipo contiene.La última propiedad es el indice del formato de texto que aparecerá en nuestro control, en este caso me aparecerá por defecto Archivos de Registro ya que he elegido la opción dos,cabe destacar que el indice no comienza en cero.

 

Continuando, al presionar sobre el botón para guardar el archivo, este realiza una llamada al método ShowDialog de la clase SaveFileDialog().

 

bool? dialogResult = this.dialog.ShowDialog();

Después compruebo que es verdadera la petición realizada con anterioridad.

if (dialogResult == true)

 

Al ser verdadero el resultado devuelto, realizo una llamada al servicio para obtener un archivo de texto desde el servidor.

Este archivo es tomado como un Array de Bytes, que escribiremos y devolveremos a través del método OpenFile de la clase SaveFileDialog.

 

using (Stream fs = (Stream)this.dialog.OpenFile())

{

fs.Write(fileBytes, 0, fileBytes.Length);

fs.Close();

this.tblError.Text = «El Archivo ha sido guardado correctamente!»;

}

 

Por último informaré al usuario que el archivo ha sido guardado correctamente, mediante un mesaje mostrandolo en pantalla.

Para finalizar como veis, a través de silverlight3 podemos utilizar un control que se usa con asidua frecuencia en la realización de las tareas diarias de nuestro trabajo, sin demasiada complejidad a la hora de crear el citado control.

Rasca y gana con InkCanvas

A través del control InkCanvas de Windows Presentation Foundation. Deseo mostrar una aplicación que pretende imitar a un décimo del rasca y gana o por podernos imaginar un cristal lleno de vaho que pretendemos limpiar para vernos reflejados. ¿Cómo vamos a lograrlo?, la solución es la utilización de uno de los controles del XAML de WPF (InkCanvas). Este se situará detrás de la imagen, así será invisible para el usuario pero nosotros podemos aprovechar todas las posibilidades que este control nos ofrece. Para asegurarnos que los clic del usuario se realicen sobre InkCanvas y nos sobre la propia imagen, tenemos que establecer la propiedad IsHitTestVisible como False.

El siguiente paso que debemos seguir es la inclusión el control VisualBrush dentro de la propiedad OpacityMask de la imagen. Para que la imagen sea visible a medida que se pinta, tenemos que pintar sobre el InkCanvas directamente. Esta funcionalidad la conseguiremos enlazando la propiedad Visual del control VisualBrush con InkCanvas (<VisualBrush Visual="{Binding ElementName=inkCanvas}"/>).

Por defecto el fondo de Inkcanvas es blanco y esta es una de las razones por las que imagen se muestra. Para evitar que se vea la imagen deberemos establecer la propiedad Background a transparente otorgándole el valor x:Null (Background="{x:Null}). También debemos otorgarle el mismo valor al Background en el Grid que contiene los controles citados con anterioridad.

Como inicialmente el grosor del pincel es demasiado pequeño, debemos aumentar el tamaño de este para que no se haga tan pesado quitar la capa que tapa la imagen, para ello utilizaremos los atributos de dibujo del InkCanvas (<DrawingAttributes Height="25" Width="25"/>).

Por último añadimos un borde para dar aspecto de un marco en un espejo o el borde del rasca y gana.

El código completo del proyecto es el siguiente:

<Window x:Class="Brush.Window1"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

Title="Window1" Height="300" Width="300">

<Border Background="#FF909090" BorderBrush="#FF000000"

BorderThickness="2,2,2,2">

<Grid Width="Auto" Height="Auto" Background="{x:Null}">

<InkCanvas x:Name="inkCanvas"

Background="{x:Null}">

<InkCanvas.DefaultDrawingAttributes>

<DrawingAttributes Height="25" Width="25"/>

</InkCanvas.DefaultDrawingAttributes>

</InkCanvas>

<Image IsHitTestVisible="False"

Source="Cein.JPG" Stretch="Fill">

<Image.OpacityMask>

<VisualBrush

Visual="{Binding ElementName=inkCanvas}"/>

</Image.OpacityMask>

</Image>

</Grid>

</Border>

 

 

</Window>

 

El resultado visual de nuestro proyecto es el siguiente:

 

 1