Archive for the BlackPoint Category

Proyecto BlackPoint Liberado!

Posted in BlackPoint, Blend, WPF on noviembre 15, 2008 by César Intriago

Por fin luego de algún tiempo he publicado todo el proyecto BlackPoint (Código fuente), comento que no se trata de una aplicación lista para usuarios finales, está orientada a personas que deseen revisar un poco temas de patrones de diseño y Windows Presentation Foundation. Espero lo encuentren interesante, hay algunas cosas que faltaría de agregarle a la aplicación pero en el punto en el que se encuentra es bastante completa y ayuda a mostrar distintas técnicas con WPF.

Pueden descargar el proyecto completo desde aquí:

BlackPoint2008.zip

Anuncios

Mas RAM !!!!

Posted in Apple, BlackPoint on noviembre 12, 2008 by César Intriago

Imagen 2Hoy le hice un pequeño “overhaulin” a mi iMac, le subí la RAM a 3GB (antes tenía 1GB), quedó una bala, se nota de forma clara el aumento en velocidad de  la máquina virtual de WinXP y activando Unity.

Por cierto espero ya la siguiente semana publicar finalmente el código de BlackPoint

Usando Databinding y ValueConverter

Posted in BlackPoint, Blend, Tutorial, WPF on septiembre 14, 2008 by César Intriago

En una de las tareas en el desarrollo de BlackPoint relacionada con enlace de datos tuve que escribir un ValueConverter personalizado para analizar una cadena de texto y en función del contenido retornar si un control debería o no ser visible. En la práctica este es el escenario:

Tengo un textblock que va a mostrar el título de una diapositiva, este textblock está enlazado (databinding) a la propiedad Name de un objeto. El contexto de los datos es una lista de valores, de tal forma que cada vez que seleccione un ítem distinto, el texto se actualiza. Este es el código XAML normalmente usado para databinding (generado por Blend):

 

<TextBlock Text=”{Binding Path=Name, Mode=Default}”  DataContext=”{Binding Path=Parts, Mode=Default}” />

 

Revisando el atributo Text, podemos observar que está enlazado a la propiedad Name de un objeto llamada Parts, este objeto Parts es del tipo List<Parts>. En un ListBox tengo listados todos los Parts, de tal forma que al seleccionar uno, se actualiza automáticamente el texto del TextBlock. El problema con este código es que cuando un Part no tenga un nombre (es decir Name == “”) el comportamiento del binding hace que muestre el nombre último ítem seleccionado que sí tenía un nombre, la verdad no se por qué funciona de esta forma o cómo es el manejo de las cadena vacías en este caso. Este era un buen escenario para usar un ValueConverter.

Un ValueConverter permite transformar un valor a otro, antes de que se realice el binding con el control. Por ejemplo, puedo crear un ValueConverter y usarlo para analizar la propiedad Name, si es vacía que ponga otro texto y sea ese el que se muestre en el TextBlock.

Crear un ValueConverter es sencillo, simplemente creamos una clase que implemente la interfaz IValueConverter:

public class TextConverter : IValueConverter
    {
        const string DEFAULT_TEXT = “…”;
        #region IValueConverter Members

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value != null)
            {
                String text = value.ToString();

                if (!String.IsNullOrEmpty(text))
                    return text;
                return DEFAULT_TEXT;
            }

            return DEFAULT_TEXT;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return value.ToString();
        }

        #endregion
    }

Como se ve en el código anterior, si la propiedad es nula o vacía,se devuelve la cadena “…”, caso contrario se devuelve la misma propiedad.

El binding para usar el TextConverter se puede realizar desde Blend, sin tener que escribir XAML, si desean hacerlo desde Blend sigan estos pasos:

  1. Seleccionen el TextBlock.
  2. Busquen la propiedad Text y seleccionen DataBinding
  3. En la parte inferior de la ventana de enlace de datos, seleccionen ValueConverter.
  4. De la ventana “Add Value Converter” seleccionen el TextConverter y presionen OK, Blend busca y presenta automáticamente las objetos del CLR que implementan la interfaz IValueConverter.

ValueConverter

De esa forma se realiza el databinding aplicando algún ValueConverter.

BONUS: Le dejo un captura de pantalla de BlackPoint:

BlackPoint08

BlackPoint – Framework

Posted in BlackPoint, Patrones de Diseño on septiembre 4, 2008 by César Intriago

BlackPoint Framework es un componente que permite desarrollar los adaptadores de contenido (módulos encargados de extraer la información de los archivos), los repositorios (módulos para persistir los datos de la aplicación), y para implementar la aplicación cliente de BlackPoint.

Precisamente este framework es el que estoy usando para desarrollador el adaptador para PowerPoint 2007, el repositorio en archivos XML y la aplicación cliente en Windows Presentation Foundation. Básicamente este framework provee:

  • Las interfaces con las que se deben programar para BlackPoint y los objetos que se pasan entre los distintos componentes de la aplicación.
  • Métodos de extensión para facilitar tareas de convertir objetos a XML y viceversa.
  • Implementaciones básicas de las interfaces para contenido.
  • Eventos para notificar al cliente sobre sucesos de los adaptadores.
  • Otros miembros de que ayudan en la implementación de los componentes.

El siguiente es un diagrama de clases del framework de BlackPoint:

BlackPoint.Framework

  • IOpenXmlPart: Representa una parte del contenido de un archivo, por ejemplo cada una de las diapositivas de una presentación se representan como una parte.
  • IOpenXmlContent:Representa un contenido en particular, por ejemplo todo una presentación en PowerPoint 2007.
  • FrameworkOpenXmlContent y FrameworkOpenXmlPart: Implementaciones concretas de las interfaces IOpenXmlContent e IOpenXmlPart, estas implementaciones se ofrecen en el framework para evitar que los desarrolladores tengan que hacerlo en sus propios adaptadores, si lo desean pueden crear también sus propias implementaciones.
  • ILibraryRepository: Cualquier repositorio de datos que se desee usar para BlackPoint debe implementar esta interfaz.Un repositorio se encarga de almacenar los datos de los contenidos, puede ser en archivos XML, bases de datos, etc.
  • IOpenXmlAdapter: Los adaptadores son los encargados de leer el contenido de los archivos y extraer sus datos, la información es cargada dentro de un objeto que implemente la interfaz IOpenXmlContent. Por ejemplo el adaptador de PowerPoint 2007 lee un paquete con extensión “.pptx” y extrae la información de Título, Autor, Descripción, Palabras claves, diapositivas y una vista previa de cada una.
  • IFileType: Permite identificar los archivos soportados por cada adaptador. Por ejemplo el adaptador para PowerPoint 2007 se usa para archivos con extensión “.pptx”.
  • ContentImportedDelegate y ContentEventArgs: Evento personalizado para notificar cuando a los subsciptores cuando un adaptador ha terminado de importar un contenido, se pasa como argumento el contenido importado.
  • Utils.GetImageStream: Lee una imagen de una Uri y la convierte a un mapa de bits en memoria.
  • Extension ToOpenXmlContent: Convierte un objeto XmlNode a IOpenXmlContent.
  • Extension ToXmlElement: Convierte un objeto IOpenXmlContent a un objeto XmlElement.
  • BlackPointSettings: Provee configuraciones generales del framework, como los nombres de los elementos para archivos XML.

Como se podrán dar cuenta, un principio básico que intento seguir es el de programar contra interfaces y no contra objetos en concreto, de esta forma se facilita la extensión del código y el soporte para nuevos módulos personalizados o especializados.

En entradas futuras publicaré mas diagramas de clases usados en BlackPoint. Como ven se han realizados algunos cambios desde la primera versión de este diagrama.

Noticias BlackPoint

Posted in Aplicaciones, BlackPoint, Blend, WPF on agosto 27, 2008 by César Intriago

Luego de superar el problema de interoperabilidad con Microsoft PowerPoint 2007 logré avanzar con el proyecto, básicamente se debía a algún tipo de conflicto con Windows Vista, posiblemente el UAC o alguna otra “característica” de seguridad, luego de probar agregar un manifiesto para elevar los privilegios de la aplicación sin ningún resultado, finalmente regresé a XP y todo volvió a funcionar bien. Adjunto algunas capturas de pantallas del proceso de desarrollo de la aplicación, creo que va bastante interesante por el tema visual y por algunos patrones de diseño que se están siguiendo, en futuras entradas hablaré de ellas, por ahora les dejo las imágenes:

BlackPoint_Blend_MainWindow
Diseñando en Blend 2 la ventana principal.
BlackPoint_Blend_Layout01
Trabajando en la disposición de controles  de la ventana de propiedades.
BlackPoint_VS_ExtensionMethods
Código en VS2008, desarrollando los métodos de extensión.
BlackPoint_VS_Project
Organización de los proyectos en VS2008.

 

BlackPoint 2008 – Avanzado !!

Posted in Aplicaciones, BlackPoint, Blend, Errores, Patrones de Diseño, Tutorial, WPF on agosto 25, 2008 by César Intriago

Maldito Qumana!! acaba de borrar todo el contenido de esta entrada, textos, imágenes, enlaces, todo. DIABLOS, voy a tener que escribir todo el post nuevamente… y lo que ya no me acuerdo….. aarrggg…. PRRRT.

Desafíos en el proyecto BlackPoint

Posted in BlackPoint on agosto 16, 2008 by César Intriago

Hola a todos, como les comenté en entradas anteriores he retomado el proyecto BlackPoint, actualmente estoy con un problema en un módulo para abrir desde C# la aplicación PowerPoint, lo extraño es que uso el mismo código de la primera versión de BlackPoint (el cual funcionaba), la única diferencia es que ahora estoy trabajando en Windows Vista y antes lo hacía en Windows XP, adjunto un captura de pantalla de error, tal vez alguien ya ha enfrentado este inconveniente y me pueda dar luces sobre como resolverlo, o por último me regresaría a Windows XP (otra vez).

ACTUALIZACIÓN: Pensé que el problema podría ser algo relacionado al UAC de Vista, así que agregué un manifiesto para que la aplicación se ejecute bajo el rol de administrador, pero con todo esto el problema persistía. Finalmente decidí regresar a XP y todo volvió a funcionar bien, así que el proyecto sigue.