Patrones de diseño
Las herramientas de patrones de diseño ya existian en visual studio 2005, la verdad es que en el 2010 son iguales, no ha cambiado mucho, si quieres algo mas serio te tienes que ir a visio o rational rose, pero para organizar nuestras librerias de clases o la carpeta appCode, la carpeta conontroller en mvc, etc puedes agreagar en tu proyecto el Class Diagram, propongo un ejemplo de un wpf con una libreria de clases con dos casos diferenciados, la calse usuario y cliente que tienen properties comunes, solo una de ellas necesita sobreeescribir el metodo original de la clase abstracta, hay van los pasos:
Pd: ejemplo de patrones de diseño con Class Diagram http://www.futurojobs.com/downloads/clases/patrondiseno.rar
Lo primero meter en la libreria de clases (o donde quieras organizar las clases el elemento diagrama de clases)
La clase abstracta es la que te va a dar los elementos comunes en este caso y la flexibilidad
En la parte de abajo de la clase podemos indicarle las variables internas, properties y metodos
A los metodos se les puede indicar el Inherance modifier
Añadimos las clases que vamos a consumir finalmente
Le indicamos con una Inherance la relacion que las une
Para poder establecer que quieres sobreescribir un metodo sobre la clase tienes que ir a Intellisense -> Override Members
Aqui dentro puedes elegir los metodos con los que cuentas a sobreescribir
Finalmente el diagrama va escribiendo las clases
Ya esta, aun siendo antigua, es una herramienta muy valida para montar cualquier factoria, documentación previa, etc…
creando un usercontrol para montar un menu en wpf
Codigo: http://www.futurojobs.com/downloads/wpf/wpfmenu.rar
Esta vez la idea ha sido crear una barra de menu que segun la instaciemos tendra mas o menos botones o comportamientos diferentes, y por supuesto puede ser invocada en cualquier sitio y las veces que sea necesario, al final reconozco que es un poco lio explicar todo lo desarrollado en un post, nada mejor que abrir el codigo y seguirlo todo.
Empezamos por una aplicacion WPF
Luego insertamos a nuestra solucion un user control library
Sobre el userControl metemos un WrapPanel dentro del grid, a ambos les damos u alto pero sin ancho, asi logramos anchos redimensionados automaticos.
Añadimos un unevo user control para el boton
Y luego dejamos el grid en primera posicion, despues metemos un border y dentro un wrappanel para poder tener dos elementos seguidos (label e image) y en posicion relativa con float a left, asi da igual si el texto es muy largo o corto, se redimensiona solo
Sobre el grid (el contenedor mas superior del boton) ponemos dos eventos
Podemos ver una funcion del evento, en este caso cuando el raton este por encima cambiamos el fondo si no esta clickado y tambin dependiendo de como haya sido instanciado si tiene cruz para cerrarse o no.
Ahora volvemos al user control inicial (MenuControl1.xaml.cs), donde esta el wrapPanel, necesitamos un metodo para ir insertando botones donde los instanciamos a medida
Tambien necesitariamos quitar botones opcionalmente (MenuControl1.xaml.cs)
Y finalmente tenemos un evento sobre el boton completo donde controlamos seleccionar el clickado y deseleccionar el anterior (MenuControl1.xaml.cs)
Esta es la vista de diseño, donde se puede ver un componente que se inicializa en un principio para ser cambiado luego dinamicamente en wpfmenu.MainWindow <my1:compEdit …
Y el xaml:
El componente del menu es el userControl1 con id=menuTop, sobre este podremos invocar a la funcion addBtn donde podemos especificar las funciones delegadas cuando se haga click por ejemplo
Asi el constructor de nuestro wpf principal se queda asi donde se omntan 4 botones:
En la ultima funcion de MainWindow la ultima linea “compSup.button1.Click” supone un evento sobre un componente puesto inicialmente en la instancia de compSup, la funcion pestans_Edit monta el segundo menu, las funciones de evento esta montadas de ejemplo
Linq to dataset toList()
Linq to dataset es una de las mejores opciones a la hora de cachear un tabla que luego vas a tener que consultar y filtrar/ordenar/hacer join con ella, un pelin rollo el hecho de tener que declararte la tabla de nuevo campo a campo pero una vez creado el dataset va fenomenal, hay va el ejemplo (http://www.futurojobs.com/downloads/linq/wpfdataset.rar)
Y el codigo del boton load data:
En verde: la declaracion del dataset
En morado:montamos la lista
En Amarillo:creamos el dataset y lo informamos
En azul: finalmente podemos hacer una consulta linq to dataset, en este caso particular hacemos un toList() para poder pasarselo al dataGrid.
Ya esta, aunque en este ejemplo no esta metido en cache si estamos en un entorno web si podriamos hacer que teviese mas potencia aun.
Serializando en un wpf
Que mejor sitio para aplicar una serializacion que un wpf que necesite mantener los registros la siguiente vez que usemos nuestro programa en local, donde no tenemos acceso a BBDD, el ejemplo esta en http://www.futurojobs.com/downloads/serializando/wpfserializar.rar, tenemos un formulario con la posibilidad de añadir coches con precio.
Lo primero es hacer una clase serializable donde vamos a tener nuestros datos, en este caso un datatable
El metodo insertar informa al datatable de la nueva fila, en caso de que sea la primera vez crea las columnas
La funcion leer recorrer el datatable para informar el grid del formulario
En el formulario de wpf instanciamos despues de la declaración de la clase el objeto de la clase que contiene el datatable
Cada vez que pinchen en insertar llamamos a la funcion insertar y leer que informa el datagrid
Luegos estan los metodos de serializar y desSerializar, ambos tienen en cuenta si ya existe el archivo
Finalmente necesitamos incluir en el XAML los eventos de Loaded y Closed para que serialize y desserialize.
Linq to objects en List(Of
Una maravilla trabajar con linq to objects, se acabo el pelear contra el ordenado de una lista por el icomparable, ahora podemos ordenar una lista, filtrar, hacer joins, etc … se me ocurren infinidad de situaciones donde necesitar linq to objects, es mas, cuando acabas de ordenar o filtrar no tienes porque recorrerte todo el array, puedes hacer un toList y convertirlo de nuevo en una coleccion.
Para este ejemplo (http://www.futurojobs.com/downloads/linq/wpflinqobjects.rar) se propone una aplicacion wpf con una clase csAuto que va a ser el tipo del List(Of
Y el codigo de la aplicación quedaria asi:
Donde se puede ver que segun clikamos en el btn Sort by name montamos una consulta en LINQ para acabar haciendole un toList.
Mas facil imposible.
Clases abstractas
Aunque no son novedad me apetecia recordarlas a ver si realmente le saco todo el potencial
Este mi ejemplo: http://www.futurojobs.com/downloads/clases/WpfClasesAbstractas.rar
Tener una clase abstracta implica poder establecer una obligación de arquitectura imponiendo unos metodos que hay que declarar en nuestra clase que lo implemnta, pero ademas tiene cualidades como las siguientes:
-Podemos inicializar la clase abstracta con un constructor obligado (opcional)
-Podemos tener funciones para ser usadas normalmente
-Podemos tener funciones para ser usadas normalmente pero que se pueden sobreescribir en destino
-Podemos tener funciones privadas
-Podemos tener properties
Luego tenemos la clase que hereda de la clase abstracta, asi que tenemos:
- Lo primero es tener un constructor en nuestra clase que a su vez implemente una llamada al contructor del heredado (subrayado en morado), aunque en este caso el constructor no hace nada, si lo hace el construcor de la clase heredada, asi que tenemos
- Una version de la funcion Desgaste sobreescrita por nosotros pero que ya no queremos que se sobreescriba mas
- Una version de la funcion velocidad sobreescrita por nosotros
- Un metodo propio consumoCiudad
Finalmente tenemos la invocacion a la clase inicial desde nuestra aplicacion con las siguientes posibilidades: las funciones Desgaste y Velocidad han sido sobreescritas, pero las funciones Consumo, Velocidades y Prestaciones han sudi heredadas directamente de la clase abstracta.
Tipos anonimos
La cantidad de codigo extra que solucionan los tipos anonimos, la verdad es que tardo en llegar con el 4.0 pero se me ocurren un monton de situaciones donde acabamos creando un clase con dos properties que no se vuelven a usar mas.
Por ejemplo, leemos un listado de marcas de coches y necesitamos guardar los valores en un List para poder llegar a la capa donde se pinta el listado, que mejor que un tipo anonimo?, hay va el ejemplo, es la segunda linea:
Y al final, por cada marca insertariamos un objeto anonimo al List, rapido y eficiente.
Propiedades autoimplementadas
La verdad es son muy faciles, pero imprescindibles a partir de ahora en cualquier desarrollo que se precie aspirar a ser rapido y bien hecho.
Que clasico rollo andar repitiendo una y otra vez un listado enorme de properties, pues se acabo, las podemos declarar en una linea y siempre y cuando sepamos que los que vamos a hacer es un set y get estandar, no hay que ir mas alla, de hecho se pueden inicializar tambien, hay va el ejemplo:
Pero realmente como funcionan internamente, por ejemplo, en el primer caso se crea la variable interna _velocidad con la cual se trabaja, aunque al final para nosotros la idea es que sea transparente, asi de facil.
Tipos de colecciones
Vamos a las colecciones mas importantes de .Net bajo un proyecto de wpf, se puede dividir en tres: arrays simples (System), colecciones basicas en (System.Collections) y finalmente colecciones genericas (System.Collections.Generic), a mi gusto las mas potentes.
Desde un proyecto en WPF proponemos una manera rapida de ver todas las colecciones (http://www.futurojobs.com/downloads/tipos_datos/wpfcolecciones.rar):
1. Comenzamos por un array simple:
Colecciones basicas
2. ArrayList: de lo mas potente en colecciones, se puede insertar lo que quieras, pero no tiene seguridad, luego tiene que hacerle casting al extraer … si vas a mezclar tipos de datos en tu coleccioón es el indicado, sino una lista generica es mucho mas optima (Punto 6)
3. Hashtable: le pasa lo mismo que al arrayList, muy potente, inseguro, y solo justficado para mezclar tipos de datos en su interior, si no es asi la opción mas sugerente seria un Dictionary(Of (Punto 7).
4. Sorted List: en teoria una lista ordenada, bajo mi punto de vista un hashTable ordenado por la key …. casi nunca vamos a necesitar ordenador una lista por la key … y mucho menos un hashTable, mejor usar un Sorted Set (Punto 9).
5. Queue: lista de la filosofia ‘primero que entra – primero que sale’, si vamos a mezclar tipos es correcta, sino mejor un list(Of (punto 10)
Colecciones Genericas
Punto 6. List (Of, la lista de tipo concreto, la coleccion mas usual
Punto 7. Dictionary, es un hashtable pero generico, donde poder especificar los tipos, con seguridad
Punto 8.SortedList Of(, es lo mismo que el sortedList de coleccionesBasicoas pero generica, sigue siendo un hashTable ordenado por la key …
9. Sorted Set: colección que ordena el tipo especificado
10. Queue de tipo generico,mas optimo que el basico
11.Y para acabar un stack generico, mas recomendable que el basico.
Manejando eventos desde cero
Ruta del ejemplo (vs2010 vb.net) : http://www.futurojobs.com/downloads/eventos/AppEventosBasico.zip
Empezamos con la creacción de un proyecto nuevo:
Delenguaje Visual Basic, Tipo Windows Form Aplication y le damos un nombre
Ahora nos vamos al toolbox
Y desde la pestaña Common Controls
Hacemos doble click sobre Button
Lo mismo con un control TextBox
Nos volvemos a la pantalla del formulario, aqui nos encontramos a los dos controles uno encima de otro
Necesitamos arrastrar la caja de texto hacia la derecha para poder ver el boton
Esto ya tiene mejor pinta, ahora hacemos doble click sobre el Button1
Nos abrira una zona de codigo, la obviamos por ahora, volvemos a la pantalla de diseño del formulario y seleccionamos en Button1
Pinchamos en el boton de la derecha, y luego en Properties
Ahora nos vamos a la pestaña de Properties (Suele estar a la derecha) y pinchamos en el cuarto icono (el del rayo), son los eventos
Podemos ver que Visual Studio ya nos ha metido en el evento click un delegado ‘Button1_Click’
Ahora si podemos ir al codigo que nos propone en el Form1.vb y vemos la funcion delegado que nos ha creado, podemos ver que incluye al final de la funcion Handles Button1.click, este es el evento
Y en si la funcion Button1_Click es el delegado
Es en esta funcion donde se hace la acción del boton, p.ej: añadir a una arrayList el valor del TextBox
Hasta aqui la primera manera de hacer un evento, ahora viene la segunda manera:
Añadimos un boton nuevo en pestaña Toolbox(izquierda) -> Common Controls -> Doble click en Button:
Arrastramos el nuevo boton hacia abajo un poco para que no este montado encima del anterior
Ahora hacemos doble click sobre el centro del formulario
Nos abrira de nuevo el codigo fuente Form1.vb y nos añade la funcion Form1_load
Aqui ponemos la segunda manera de colocar un evento, con la linea AddHandler Button2.Click, AddressOf Delegado_Boton2_Propio
Tambien necesitaremos un metodo delegado nuevo, en este caso Delegado_Boton2_Propio.
Con la linea del addHandler (de la función AddHandler) y el metodo delegado tenemos otra manera de vincular un evento a un boton, que funciona igual de bien que la primera opción.
Dejar un comentario











































































