domingo 18 de abril de 2010

Hablando... ¡tu aplicación te entiende!

El pasado Viernes 16 de Abril, en el auditorio Ollantaytambo de la Universidad Ricardo Palma, hice una pequeña demostración de una aplicación realizada en WPF que era capaz de reconocer instrucciones habladas. Es decir, mediante palabras, podías hacer que tu aplicativo realice ciertas instrucciones.

La librería que permite que esto sea osible es System.Speech.

La demo que presenté fue un semáforo, que con 3 instrucciones(Alto, Preparado, Pase) prendía alguna de sus luces indicando la señal correspondiente.

Aquí les dejo una imagen del aplicativo además de los archivos para que los puedan ver y probar.



Este aplicativo esta desarrollado bajo el .Net Framework 3.5.




Espero les guste

lunes 1 de marzo de 2010

Integrando WPF con Windows 7

Saludos a todos!

Hoy hace unos minutos estaba navegando por internet buscando de que forma integrar algunas de las características de Windows 7 con alguna de las aplicaciones que haya hecho en WPF.

Me pareció interesante y que en la versión de .NET Framework 4.0 sale una nueva versión de WPF, la que tiene nuevas clases y nuevas funcionalidades. Para ello requeriremos actualizar nuestro IDE al 2010 en cualquiera de sus versiones (Visual C# o Visual Basic 2010, o cualquier version de Visual Studio 2010) que se encuentra ya en Release Candidate desde el pasado mes.

Pero... para los que no quieren mandarse a instalar una versión preliminar de este IDE o para los que no lo ven del todo estable todavia (como yo)... nos queda resignarnos a esperar a que sea lanzado este nuevo .Net Framework.

Pues en realidad NO ES ASI! Para el alivio de muchos, podemos realizar aplicaciones que utilicen características de Windows 7 con el framework 3.5 SP1.


¿Cómo?

....Es así de sencillo. En Code MSDN se ha publicado una librería llamada WPF Shell Integration Library.
Dentro de este portal tenemos la libreria (Binary) y el código (Source).
Como verán, no se necesita tener el .net framework 4.0 para poder aprovechar las características de Windows 7.

Happy Coding!

sábado 27 de febrero de 2010

WPF Toolkit, February Release

Esta noticia la encontre navegando por facebook, que aunque para muchos parezca cuestionable, es una gran fuente de información. Así como twitter.

En fin, navegando por facebook, encontre un grupo dedicado exclusivamente a tratar temas sobre wpf. Obviamente me hice fan.

La noticia que vi fue que ya salio la version de WPF Toolkit de Febrero.

Entre las novedades tenemos nuevos controles:

  • Accordion
  • AutoCompleteBox
  • Rating

Además de algunos bugs resueltos.

Aquí les dejo el link para que ustedes mismos lo prueben. En los siguientes post haré algunas demos de uso de estos controles.

Espero les guste.

viernes 26 de febrero de 2010

MDI en WPF...volviendo a las antiguas usanzas

Pues para muchos el titulo de este blog es algo injusto. La razón: desde la primera vez que WPF se dio a conocer, no se ha visto que tenga algún control de forma nativa para contener formularios dentro uno mismo (MDI). Esto, si quieren entender el porque, les dejo un artículo en el que se explica a detalle (post en ingles).

Me animé a realizar este post, ya que hace unas semanas quice realizar un sistema distribuido con WCF (estoy en pañales en ese tema, pero iniciandome con bastantes espectativas). Pero para ello quería ver la forma de usar varios formularios a la vez.




Investigando encontre que este control (ahora es un ontrol) lo pueden encontrar el el portal de codeplex. Si quieren analizarlo y agregarle algunos detalles más, sientanse libres. Ya que en esta publicación también viene incluido el código.

Sin más rodeos les dejo el enlace.

domingo 21 de febrero de 2010

Usando Reporting Server en WPF

Aunque para muchas personas les cueste creer, o ya se habían dado por vencidos al querer usar el SQL Reporting Server en Windows Presentation Foundation. Pues al respecto WPF no ofrece un control como el Report Viewer o Cruystal Report como control nativo de esta tecnología.

Pero para este proposito vamos a usarotro control, uno que a muchos les parecerá algo fuera de lugar. Nuestro control a usar es el WebBrowser, disponible a partir de la versión del .NET Framework 3.5 SP1.

No se sorprendan, este control lo que nos permite es, como su homologo en las aplicaciones Desktop del framwork 2.0, navegar como algún otro browser de internet. Solo que ahora lo usaremos de una manera diferente.

Ahora pasaremos a la demostración.
Para ello les daré unos requisitos previos (si quieren poner en practica esta pequeña demostración o descargarla):


  • SQL Reporting Server 2008
  • Visual Studio 2008 (en cualquiera de sus versiones o C# express) con el SP1 instalado. Como recomendación al momento de abrir el IDE hacerlo como Administrador
  • AdventureWorksLT2008, sino lo tienes puedes descargarlo en este enlace

Cumpliendo estos requisitos, lo siguiente a realizar será Abrir nuestro IDE y crear una solución en blanco, a la que llamaremos UsingReportingServerOnWpf.

Posteriormente pasamos a Agregar > Nuevo Proyecto
Seleccionamos Proyectos de Business Intelligence al cual le daremos el nombre de ReportProject


Una vez aceptado, nos mostrará un wizard, en el cual siguiendo los pasos configuraremos nuestro primer informe. para ello les ire mostrando la secuencia a seguir:





























Terminando este wizard, le hacemos algunos ajustes visuales de acuerdo a sus gustos. Luego pasamos a implementar el proyecto. Click derecho sobre nuestro proyecto > Implementar


De esta manera las podremos ver en la página de Reporting Service



Una vez finalizado este proceso, pasaremos a crear nuestra aplicación en WPF para visualizar nuestro informe ya creado.
Para ello haremos click derecho sobre nuestra solución > Agregar Nuevo Proyecto > Windows > Aplicación WPF
Le daremos a este proyecto por nombre: WpfViewReport


En el XAML pasamos a agregar el siguiente código dentro del Grid:
WebBrowser Name="ReportBrowser"/>

y en el code-behind agregamos los siguientes fragmentos de código:

En el constructor:
this.Loaded+=new RoutedEventHandler(Window1_Loaded);

En el Método Window1_Loaded
ReportBrowser.Source=new Uri(http://localhost/ReportServer/Pages/ReportViewer.aspx?%2fSalesReport&rs:Command=Render, UriKind.RelativeOrAbsolute));

Una vez realizado esto, ejecutamos nuestra aplicación y nos permitira visualizar nuestro reporte.


Es mus posible que antes de mostrar el reporte en el formulario, se solicite un logueo. Esto dependiendo de la configuración que se tenga en el Reporting Server.

Como vemos este es un reporte bastante senicllo. No hay mucha interacción con el usuario. Si queremos que nos muestre un reporte en base a parametros ingresados, tenemos dos opciones:
  • La primera es dentro del query que tenemos al armar nuestro reporte declaramos los parametros, con lo que antes de mostrar el informe nos mostrará cajas de texto en las que se solicitan los parametros. Esto lo pide desde el propio informe.
  • La otra opción es crear un informe y mandar un reporte desde programación (creando una aplicación web en la que se pidan los parametros y crear el reporte desde programación en javascript). Esto es más complejo pero a su vez mas completo. Ya que el WebBrowser nos permite ejecutar javascript, asi que podemos crear los parametros que querramos y crear un formulario en WPF en la que se pida el ingreso de los parametros de forma visual e interactiva (datepicker, combobox, etc). En un siguiente post presentaré esta versión de creación de un reporte en WPF.

Espero que este post haya sido de su agrado.

Saludos,

Juan Carlos

martes 5 de enero de 2010

Usando ObservableCollection

Saludos con todos,
hace un par de semanas me pidieron una pequeña demo de ObervableCollection. Pues como explique en el post anterior, esta clase nos permite trabajar con una estructura de datos de tipo Listas, solo que contiene algunas propiedades adicionales.

Pues aquí vamos con la pequeña demo.


Para empezar creamos un nuevo proyecto en WPF




Luego agregaremos al proyecot una clase. A la cual llamaremos Persona.



A esta clase le agregamos el siguiente fragmento de código.

public class Persona
{
string nombre;

string
apellido;
string
direccion;
int edad;

public string Nombre
{
get { return
nombre; }
set
{ nombre = value; }
}

public string
Apellido
{
get { return
apellido; }
set
{ apellido = value; }
}

public string
Direccion
{
get { return direccion; }
set { direccion = value; }
}

public int
Edad
{
get { return
edad; }
set
{ edad = value; }
}
}


Luego nos dirigimos a ver el CodeBehind de nuestra Ventana Principal.



using System.Windows;using System.Collections.ObjectModel;


namespace
DemoObservableCollection
{

public partial class
Window1 : Window

{

public
Window1()

{
InitializeComponent();
this.Loaded += new
RoutedEventHandler(Window1_Loaded);
}

void Window1_Loaded(object
sender, RoutedEventArgs e)
{

ObservableCollection<Persona> ListaPersonas =
new
ObservableCollection<Persona>()
{
new Persona{Nombre="Juan",Apellido="Vega", Direccion="Lima - Perú", Edad=21
},
new Persona{Nombre="Alvaro",Apellido="Escalante", Direccion="Tarija - Bolivia", Edad=23
},
new Persona{Nombre="Estefano",Apellido="Alvarillo", Direccion="Quito - Ecuador", Edad=30
},
new Persona{Nombre="Isabel",Apellido="Valverde", Direccion="Buenos Aires - Argentina", Edad=25
},
new Persona{Nombre="Eduardo",Apellido="Ortega", Direccion="Santiago - Chile", Edad=24
},
new Persona{Nombre="Juan",Apellido="Alfaro", Direccion="Lima - Perú", Edad=24
}
};
            lstPersona.DataContext= ListaPersona


}

}

}
Podemos ver que es muy similar al trabajo con listas.
Ahora pasamos a mostrarlo en nuestro formulario.
Para esto agregaremos un ListBox a nuestra ventana. Y pasamos a agregarle el siguiente codigo

domingo 11 de octubre de 2009

Observable Collection

Pues bien, heme aqui después de mucho tiempo sin postear. La razón... decidí poner a prueba todos mis conocimientos adquiridos en WPF y desarrollar un sistema algo complejo integramente bajo esta plataforma. Claro, todavía no termino el proyecto pero cada vez que lo veo me inspiro más.

Ahora, como verán en el título. Este post es sobre Observable Collection... pero que no es una Lista. Pues en realidad si lo es, pero esta lista especial, proveniente de System.Collections.ObjectModel en realidad nos permite de mejor manera jugar con los datos.
La razón, esta colección generica lo que hace es notificarse en cuanto hay un cambio interno (Actualizacion, eliminacion, agregación) y esto gracias a que tiene implementado nativamente el INotifyPropertyChanged

Pero en que casos conviene usar este modelo de colecciones, pues sencillamente cuando queremos que los datos de nuestro listbox o algun control que nos muestre estos datos deba estar actualizandose cada vez que alla un cambio.