miércoles, 16 de diciembre de 2015

Juego de Ajedrez (II). Creando la estructura del proyecto

Artículos anteriores:
Juego de Ajedrez (I). Introducción a la Programación Orientada a Objetos

El código completo tanto en C# como en Visual Basic .NET está disponible en:

Códigos de muestra - Ejemplos MSDN. Juego de Ajedrez

Tras hacer un resumen de lo que iremos viendo a lo largo de los diferentes artículos, vamos a meternos en harina creando el proyecto y la estructura básica de clases que encapsularán la funcionalidad de nuestro juego de ajedrez.

sábado, 12 de diciembre de 2015

Juego de Ajedrez (I). Introducción a la Programación Orientada a Objetos

Hace tiempo me llegó una consulta de un desarrollador que para iniciarse en la programación orientada a objetos había decidido intentar desarrollar un juego de ajedrez.
Me pareció un ejercicio muy interesante así que, siguiendo la idea, decidí "apropiármela" y preparar un juego de ajedrez que pueda servir de ejemplo de programación orientada a objetos en .NET.

Puede que la implementación no sea la óptima, de hecho he ido tomando las decisiones del desarrollo pensando sobre todo en que el código resulte sencillo y fácil de seguir de forma que el lector pueda centrar su atención en la definición de las clases, propiedades, métodos, herencias, etc.

En ocasiones utilizo incluso diferentes soluciones para el mismo problema de forma que existan en el código ejemplos de distintas opciones existentes.

A lo largo de los artículos iré mostrando paso a paso la construcción del código del juego. El lector puede optar por ir construyéndolo según avance en la lectura, o descargarse el código completo al inicio e ir siguiendo las explicaciones sobre él.

sábado, 5 de diciembre de 2015

ASP.NET MVC. htmlAttributes en los métodos Editor y EditorFor

En muchos de los métodos de extensión de la clase HtmlHelper de ASP.NET MVC podemos encontrar un parámetro htmlAttributes que nos permite indicar valores a atributos HTML adicionales a incluir en el código HTML generado por el método.

Estos parámetros suelen aceptar un objeto IDictionary<string,object> en los que la clave de cada elemento representa el nombre del atributo y el valor del elemento representa el valor del atributo, o un objeto en el que el nombre de sus propiedades se corresponden con los nombres de los atributos y el valor de éstas con el valor de los atributos.

Sin embargo hay dos métodos de gran uso, y en los que resultaría extremadamente útil, en los que no se incluye en ninguna de sus sobrecargas: los métodos Editor y EditorFor.

miércoles, 2 de diciembre de 2015

Windows Forms. DataGridView. Columna para números con decimales (y II)

Artículos anteriores:
Windows Forms. DataGridView. Columna para números con decimales (I)

Una vez definida la clase para la definición de la columna aún nos quedaría implementar la lógica de la clase NumericGridCell que se encargará de controlar los caracteres introducidos por el usuario y el formato en el que se mostrarán los números en la celda.

domingo, 29 de noviembre de 2015

Windows Forms. DataGridView. Columna para números con decimales (I)

A raíz de la publicación del artículo DataGridView. Columna que acepta sólo números. un par de lectores del blog me cuestionaron sobre la forma de modificar el ejemplo para  añadir la posibilidad de introducir números decimales.

Con el objetivo de responder a esta duda vamos a ver cómo podemos definir una columna a la que le podamos indicar no sólo el número de decimales a mostrar, si no también el separador decimal a utilizar a la hora de mostrar los valores.

sábado, 26 de septiembre de 2015

LINQ. Ordenar por múltiples criterios.

Esta es una consulta bastante habitual.

Cuando tenemos una colección de elementos podemos utilizar los métodos de extensión OrderBy y OrderByDescending para ordenarla de forma sencilla por alguna de sus propiedades pero, ¿qué sucede cuando el criterio de ordenación es múltiple?

miércoles, 23 de septiembre de 2015

Visual Studio 2015. La nueva ventana de configuración de excepciones

En Visual Studio 2015 ha cambiado la ventana de configuración de excepciones. La verdad es que la primera vez que fui a usarla me costó encontrarla (ha cambiado también su ubicación en el menú) pero, una vez localizada, me encontré con una ventana mucho más cómoda y práctica.

domingo, 16 de agosto de 2015

Visual Studio Code. El editor de código multiplataforma de Microsoft.

Parece que la apertura de Microsoft a plataformas, lenguajes y herramientas de terceros es una apuesta seria.

Esta apertura a la comunidad de desarrollo, sin encerrarse en su mundo de herramientas, lenguajes y plataformas propias, ya lo había demostrado con diferentes pasos: participando o liderando proyectos open source, adaptando su navegador Internet Explorer a los estándares o modificando su principal herramienta de desarrollo (Visual Studio) no sólo para desarrollar aplicaciones en diferentes plataformas (Mac, Android), si no también para integrarse con herramientas de terceros como Git.

También cabría comentar la posibilidad que da Azure de trabajar con diferentes plataformas y aplicaciones.

Sin embargo sus herramientas de desarrollo (la principal Visual Studio) sigue requiriendo de un sistema Windows para poder ser utilizada.

Pues Microsoft ya ha dado el primer paso para romper esta última barrera, y el responsable de conseguirlo se llama Visual Studio Code.

viernes, 14 de agosto de 2015

Windows Forms. Mostrar imagen a pantalla completa

Hace poco me realizaron una pregunta sobre cómo se puede mostrar una imagen a pantalla completa en Windows Forms. La verdad es que es algo que resulta muy sencillo de implentar en Windows Forms y que genera un efecto muy llamativo para el usuario.

sábado, 18 de julio de 2015

ASP.NET. Integrar tests JavaScript en Visual Studio (y II)

Artículos anteriores:
ASP.NET. Integrar tests JavaScript en Visual Studio (I)

Tras instalar y configurar Chutzpah para poder integrar los tests JavaScript en el Explorador de Pruebas del Visual Studio, en este artículo veremos las diferentes opciones que nos proporciona Chutzpah para ejecutar los tests, analizar la cobertura de código, etc.

miércoles, 15 de julio de 2015

ASP.NET. Integrar tests JavaScript en Visual Studio (I)

Visual Studio nos proporciona herramientas para crear y gestionar tests del código de nuestras aplicaciones. En el caso de las aplicaciones ASP.NET estas herramientas nos permiten gestionar tests del código de servidor, sin embargo no disponemos de ninguna herramienta para testear el código JavaScript del lado de cliente.

Para realizar ese tipo de tests podemos utilizar diferentes librerías como Jasmine o QUnit, sin embargo estas librerías proporcionan sus propios entornos de ejecución de las pruebas por lo que tendremos que acceder a dos entornos diferentes para ejecutar el conjunto completo de tests.

Por suerte existe una herramienta de software libre que nos permite integrar los tests JavaScript en el Explorador de Pruebas del Visual Studio: Chutzpah.

jueves, 25 de junio de 2015

miércoles, 24 de junio de 2015

C# Llamar desde un constructor a otro de la misma clase o de la clase padre

Cuando disponemos de una clase con diferentes constructores C# nos proporciona una sintaxis sencilla para invocar desde un constructor a otro a través de las palabras clave this y base.

martes, 23 de junio de 2015

ASP.NET MVC. ModelValidatorProvider personalizado (y II) - Implementando el Proveedor

Artículo anterior:
ASP.NET MVC. ModelValidatorProvider personalizado (I) - Creando el proyecto de prueba

Tras crear el proyecto de prueba en este artículo vamos a ver cómo crear un proveedor de validadores personalizado de forma que podamos incluir validaciones en función del usuario autenticado en la aplicación.

ASP.NET MVC. ModelValidatorProvider personalizado (I) - Creando el proyecto de prueba

El espacio de nombres System.ComponentModel.DataAnnotations nos proporciona diferentes atributos de validación con los que decorar las clases y propiedades del modelo. Estos atributos son interpretados por el framework de ASP.NET MVC para aplicar estas validaciones en nuestros controladores y vistas.

Sin embargo existen ocasiones en que estas validaciones no podemos definirlas de manera estática en la definición del modelo porque dependen de otras variables. Por ejemplo, ¿cómo definimos el rango de valores aceptados por un campo importe si el importe máximo depende del usuario que esté realizando la operación?

Por suerte la extensibilidad del framework de ASP.NET MVC nos permite crear nuestro propio proveedor de validaciones en el que podemos tener en cuenta circunstancias como ésta.

martes, 16 de junio de 2015

Ninject. Hola Mundo (y II). Sacándole partido al contenedor de dependencias

Artículo anterior:
Ninject. Hola Mundo (I). Qué es la inyección de dependencias?

Tras ver en el anterior artículo lo que es la inyección de dependencias, en este artículo veremos que ventajas nos proporciona recurrir a un contenedor de dependencias como Ninject y cómo utilizarlo.

viernes, 12 de junio de 2015

Ninject. Hola Mundo (I). ¿Qué es la inyección de dependencias?

Con este artículo pretendo iniciar un pequeño tutorial basado en ejemplos para mostrar cómo utilizar un framework de inyección de dependencias como Ninject.

En primer lugar crearé un primer ejemplo en el que trataré de mostrar qué es eso de la inyección de dependencias, porqué nos puede resultar útil y cómo Ninject puede ayudarnos.

martes, 2 de junio de 2015

Nuevo blog Píldoras JS

He creado un nuevo blog Píldoras JS en las que, la igual que en éste, iré publicando diferentes artículos y ejemplos de código sobre desarrollo web del lado de cliente: HTML5, CSS3, JavaScript y diferentes librerías JavaScript, como JQuery, Bootstrap, SlickGrid, Jasmine...

Simplemente espero que. al igual que a mí me han resultado de mucha utilidad muchas páginas y blogs, tanto Píldoras .NET como Píldoras JS puedan resultar de utilidad a alguien.





sábado, 30 de mayo de 2015

ASP.NET. Definir páginas de error personalizadas

En muchas ocasiones nos puede interesar páginas de error personalizadas en nuestros proyectos, bien para mostrar información de ayuda para el usuario o datos de contacto de nuestro departamento de soporte.

ASP.NET nos permite configurar estas páginas de error personalizadas de forma sencilla.


miércoles, 27 de mayo de 2015

Windows Forms. TextBox con sugerencias (III) - Personalizar las sugerencias

Este artículo es continuación de:
Windows Forms. TextBox con sugerencias (I) - Creando el control
Windows Forms. TextBox con sugerencias (II) - Creando el proyecto de pruebas

En los artículos anteriores he creado un control que emula la funcionalidad de mostrar sugerencias del TextBox estándar del Framework de .NET.

En este artículo mostraré cómo podemos modificar el control para que acepte como origen de datos para las sugerencias objetos de cualquier tipo y que el desarrollador pueda personalizar tanto el texto que se genera como sugerencia como el algoritmo para seleccionar las sugerencias a mostrar a partir del texto introducido por el usuario.


domingo, 24 de mayo de 2015

Windows Forms. TextBox con sugerencias (II) - Creando el proyecto de pruebas

Este artículos es continuación de:
Windows Forms. TextBox con sugerencias (I) - Creando el control

En el anterior artículo vimos cómo crear un control TextBox que emulaba la generación de sugerencias estándar de este control.

En este artículo crearé un proyecto de prueba que nos sirva tanto para probar tanto la funcionalidad actual del control, como la que tratamos de conseguir: un control TextBox que nos permita personalizar el método de generación de sugerencias.

jueves, 21 de mayo de 2015

Windows Forms. TextBox con sugerencias (I) - Creando el control

El control TextBox incluido con en el Framework de .NET incorpora la opción de mostrar sugerencias mientras se escribe estableciendo la propiedad AutoCompleteMode al valor Suggest. Sin embargo la posibilidad de controlar los textos sugeridos es muy limitada, se limita a mostrar los textos que comienzan con el texto introducido por el usuario en el TextBox a partir de una colección de cadenas.

Sin embargo, ¿qué pasa si el criterio que queremos utilizar para seleccionar los textos a sugerir es otro? Por ejemplo si queremos implementar un control con sugerencias al estilo de las búsquedas de Google.


En este artículo, y los siguientes, voy a mostrar cómo podemos crear un control TextBox que nos permita elegir el algoritmo a utilizar para mostrar los textos sugeridos.

lunes, 18 de mayo de 2015

Windows Forms. Personalizar la apariencia de los items de un ListBox

En este artículo voy a mostrar cómo se puede personalizar la apariencia individual de cada elemento de un control ListBox.

El objetivo final es conseguir un ListBox con esta apariencia.

Listbox con elementos personalizados


sábado, 16 de mayo de 2015

.NET Framework. Método de extensión ForEach para IEnumerable

Desde la aparición de Linq muchos nos hemos hecho auténticos adictos de esta librería, hasta el punto de que si ahora nos la quitasen tendríamos que reinventarla.

Tareas que antes producían decenas de líneas de código difícil de entender y de mantener, de repente pasaban a poder implementarse en una sola instrucción, lo que redundaba en un incremento en la productividad, la claridad del código y su mantenibilidad.

Sin embargo, dentro de los métodos de extensión de la interfaz IEnumerable<T>, muchos hemos echado de menos un método que nos permita realizar una acción sobre todos los elementos de la colección: un método ForEach.

lunes, 11 de mayo de 2015

ASP.NET MVC. Personalizar el Motor de Vistas de MVC (y IV). Generando las salida HTML de vistas personalizadas.

Este artículo es continuación de:
ASP.NET MVC. Personalizar el Motor de Vistas de MVC (I). Creando el escenario.
ASP.NET MVC. Personalizar el Motor de Vistas de MVC (II). Comprendiendo las vistas de MVC.
ASP.NET MVC. Personalizar el Motor de Vistas de MVC (III). Creando y registrando el motor de vistas.

En los artículos precedentes hemos visto cómo crear y registrar un motor de vistas personalizado para gestionar vistas en un formato propio. Sin embargo aún nos quedaba un último paso: la generación del código HTML para generar el formulario a partir de la vista de forma que se integre con MVC y sus características de validación y enlace de datos.

sábado, 9 de mayo de 2015

ASP.NET MVC. Personalizar el Motor de Vistas de MVC (III). Creando y registrando el motor de vistas.

Este artículo es continuación de:
ASP.NET MVC. Personalizar el Motor de Vistas de MVC (I). Creando el escenario.
ASP.NET MVC. Personalizar el Motor de Vistas de MVC (II). Comprendiendo las vistas de MVC.

En los anteriores artículos creamos un escenario en el que generábamos vistas en un formato xml personalizado y tratamos de comprender la forma en que el Framework de ASP.NET MVC gestiona las vistas.

En este artículo mostraré cómo crear y registrar el motor de vistas para gestionar estas vistas en formato xml.

miércoles, 6 de mayo de 2015

ASP.NET MVC. Personalizar el Motor de Vistas (View Engine) de MVC (II). Comprendiendo las vistas de MVC.

Este artículo es continuación de:
ASP.NET MVC. Personalizar el Motor de Vistas de MVC (I). Creando el escenario.

En el anterior artículo creamos un escenario con un formato de vistas xml en el que nos resultaría útil crear un motor de vistas personalizado. En este artículo voy a mostrar cómo crear y registrar el motor de vistas que generará las páginas de la aplicación a partir del formato de vistas personalizado.

domingo, 3 de mayo de 2015

ASP.NET MVC. Personalizar el Motor de Vistas de MVC (I). Creando el escenario.

El Framework de ASP.NET MVC incorpora el motor de vistas Razor, el cual proporciona un formato de vistas muy flexible y potente. Sin embargo existen escenarios en los que puede resultar compleja definir nuestras vistas utilizando Razor.

Por suerte ASP.NET MVC está diseñado expresamente para permitir una gran flexibilidad y extensibilidad y, para estos casos, nos permite crear nuestro propio motor de vistas.

En esta serie de artículos voy a mostrar cómo podemos desarrollar nuestro propio motor de vistas integrado con el Framework de ASP.NET MVC.

jueves, 30 de abril de 2015

.NET Framework. Evaluar expresiones aritméticas

Implementar un evaluador de expresiones aritméticas puede resultar una tarea ardua. Sin embargo el Framework de .NET nos permite utilizar el motor de JScript para evaluar expresiones matemáticas de forma sencilla.


lunes, 27 de abril de 2015

ASP.NET MVC. Obtener el código generado por una vista Razor cshtml/vbhtml

El motor de vistas de Razor traduce las vistas escritas en sintaxis Razor a clases con código en C# o VB.NET y a continuación las compila. Este es el motivo por el que resulta tan sencillo incluir fragmentos de código en C# o VB.NET en las vistas.

En ocasiones puede resultar útil analizar el código de estas clases, bien para localizar errores, bien para comprender cómo funcionan estas vistas. Sin embargo puede resultar complicado localizar los archivos en los que el motor de vistas Razor genera este código. Vamos a ver cómo podemos encontrarlos de manera sencilla.

viernes, 24 de abril de 2015

Windows Forms. DataGridView. Columna con editor de fechas.

El DataGridView es un control con funcionalidad básica que permite una gran extensibilidad. En este artículo mostraré como crear una columna para datos de tipo fecha que utilice un DateTimePicker como editor.


martes, 21 de abril de 2015

Windows Forms. El puntero del ratón desaparece.

El control ComboBox toma el control de todos los eventos del ratón del formulario cuando se despliega el problema es que no inicializa el cursor del ratón por lo que, hasta que se cierra el desplegable, se mantiene el mismo cursor que se encontraba activo y, si estaba oculto, directamente no se muestra.


sábado, 18 de abril de 2015

Windows Forms. DataGridView. Columna que acepta sólo números.

En este artículo voy a mostrar cómo crear un nuevo tipo de columna para el DataGridView para almacenar valores numéricos enteros, de forma que las celdas únicamente admitan la introducción de caracteres numéricos.

miércoles, 15 de abril de 2015

Windows Forms. Imágenes Windows MetaFile y Clipboard

Debido a las limitaciones de la implementación del objeto DataObject que utiliza el .NET Framework para manejar los datos del Portapapeles de Windows nos podemos encontrar con que nuestra aplicación no reconozca las imágenes de tipo Windows MetaFile que otras aplicaciones han colocado en el Portapapeles.

Y, en la otra dirección, nos podemos encontrar también con que otras aplicaciones no son capaces de reconocer las imágenes de este tipo que colocamos en el Portapapeles desde nuestra aplicación.

En este artículo mostraré cómo podemos utilizar la API de Win32 para crearnos una clase helper que nos permita salvar este problema.

domingo, 12 de abril de 2015

ASP.NET MVC. Gestión de Scripts en Plantillas y Vistas Parciales

En este artículo mostraré cómo podemos gestionar los scripts de plantillas y vistas parciales sin cargar código de más en páginas que no lo necesitan ni repetir código en páginas que muestran varias veces una misma plantilla.

martes, 7 de abril de 2015

ASP.NET MVC. Plantilla de editor para fecha y hora

En este artículo voy a mostrar cómo crear en un proyecto MVC un editor personalizado para los tipos de datos de fecha y fecha y hora. El editor se basa en el plugin DateTimePicker de jQuery.

sábado, 4 de abril de 2015

Windows Forms. Control TextBox con Botón

Campos de búsquedasUn interfaz que nos encontramos con mucha frecuencia es el cuadro de texto con un botón asociado. Se utiliza principalmente en pantallas de búsquedas, pero también nos lo podemos encontrar para cubrir otras necesidades: acceso a interfaces de entrada de datos (calendario, calculadora, ...), a información de ayuda, etc.

Por desgracia el framework de .NET no incluye un control con esta funcionalidad. Podemos suplir esta carencia creándonos un control de usuario con un TextBox y un Button, pero vamos a ver cómo podemos modificar el TextBox para añadirle esta funcionalidad, creando un nuevo control que herede del control TextBox.

domingo, 29 de marzo de 2015

ASP.NET. Localizando Data Annotations (y III) - Personalizar Atributos de Validación

Este artículo es continuación de:
ASP.NET. Localizando Data Annotations (I) - Archivos de recursos
ASP.NET. Localizando Data Annotations (II) - Utilizar una plantilla T4 para conectar a cualquier origen

Ya hemos visto cómo adaptar nuestros textos de los atributos de validación al idioma del usuario a través de archivos de recursos o a través de una plantilla de texto T4, mediante la cual conseguíamos independizar la gestión de nuestros textos del origen de datos utilizado. Sin embargo esta última solución también tiene sus pegas.

Por un lado están los problemas inherentes a las plantillas de texto T4. Hemos creado una plantilla T4 que, compilándose en tiempo de diseño, generaba una nueva clase. Es código que genera código, código al fin y al cabo. Pero código difícil de mantener, depurar y testear.

Por otro lado, lo que estamos haciendo en realidad, es crear una clase con información redundante para poder emular el funcionamiento de los archivos de recursos. Esto nos obliga a tener sincronizada nuestra nueva clase con el origen de datos de los textos. Cuando añadamos o eliminemos textos de nuestro origen de datos deberemos recompilar nuestra aplicación y, lo que es más importante, para compilar nuestra aplicación deberemos tener nuestro entorno de desarrollo conectado a un origen de datos con los textos completamente actualizados.

sábado, 28 de marzo de 2015

Windows Forms. MDI Child sin ControlBox

En muchas ocasiones, al desarrollar nuestras aplicaciones de escritorio, deseamos hacer navegar al usuario entre diferentes pantallas sin necesidad de ir abriendo diferentes ventanas.

Para lograrlo podemos implementar diferentes soluciones, por ejemplo tener diferentes paneles o controles de usuario ocultos en un formulario que se van mostrando según va navegando el usuario de una pantalla a otra.

Otra posible solución es la de usar un formulario MDI e ir mostrando en su interior los diferentes formularios hijos maximizados, pero ¿cómo evitamos que el usuario pueda redimensionar o minimizar el formulario hijo? ¿Cómo podemos conseguir que nuestro formulario hijo ocupe todo el espacio del formulario contenedor y que no nos muestre los botones de minimizar, restaurar y maximizar?

miércoles, 25 de marzo de 2015

ASP.NET. Localizando Data Annotations (II) - Utilizar una plantilla T4 para conectar a cualquier origen

Este artículo es continuación de:
ASP.NET. Localizando Data Annotations (I) - Archivos de recursos

En la última entrada mostré cómo utilizar archivos de recursos para mostrar los mensajes de los atributos del namespace Data Annotations en función del idioma del usuario.

Pero ¿qué sucede si tenemos los textos de nuestra aplicación en otro lugar, por ejemplo en una base de datos?

En este ejemplo mostraré cómo podemos utilizar una plantilla de texto T4 para obtener los textos a partir de cualquier origen de datos.

sábado, 21 de marzo de 2015

ASP.NET. Localizando Data Annotations (I) - Archivos de recursos

El espacio de nombres System.ComponentModel.DataAnnotations proporciona clases de atributos que se usan para definir los metadatos para ASP.NET MVC y los controles de ASP.NET.

Estos atributos nos permiten especificar las cadenas a utilizar en la interfaz de la aplicación cuando se hace referencia al campo, se detectan errores de validación, etc. Esto resulta muy útil para tener definidas estas cadenas en un único lugar de la aplicación y que los mensajes al usuario sean uniformes a lo largo de toda nuestra aplicación.

Sin embargo, en este mundo cada vez más globalizado, cada vez son menos las aplicaciones cuyo interfaz se define en un único idioma. Entonces, ¿cómo utilizamos los atributos del namespace DataAnnotations de forma que nuestros textos se adapten al idioma del usuario?

lunes, 16 de marzo de 2015

Visual Studio. Buscar todas las implementaciones de un miembro de una Interfaz

Muchas veces nos encontramos con la necesidad de localizar dentro de un Proyecto o Solución todas las implementaciones de un determinado miembro de una Interfaz, bien sea una Propiedad, Método o Evento.

ASP.NET MVC. RedirectToAction propagando el QueryString

En ocasiones nos podemos encontrar con en una acción de redirección necesitamos pasar valores recibidos en el QueryString a la acción destino. Si los posibles parámetros son pocos y claramente definidos podemos hacerlo a través del parámetro routeValues. ¿Pero qué pasa si los posibles parámetros son muchos o, peor aún, indefinidos?

He leído algún comentario por parte del equipo de desarrollo de MVC indicando que es una problemática a la que tienen pensado dar solución en futuras versiones. Pero, ¿qué se puede hacer mientras tanto?

domingo, 15 de marzo de 2015

Visual Studio. Agregar carpeta como vínculo.

En muchas ocasiones nos encontramos con la necesidad de compartir ficheros entre varios proyectos. Para ello Visual Studio nos da la posibilidad de añadir ficheros "como vínculos", de forma que podamos utilizar el fichero en un nuevo proyecto manteniéndolo en su ubicación original, sin necesidad de duplicar el fichero:


Sin embargo, ¿qué sucede cuando necesitamos compartir el contenido completo de una carpeta? Podemos querer compartir, por ejemplo, el contenido de una carpeta de imágenes para que todas nuestras aplicaciones utilicen los mismos juegos de iconos.