[Reflection] Un momento de reflexión… para Windows Mobile (MenuItem.Click)

Las limitaciones a las que nos vemos sometidos habitualmente los desarrolladores de Compact Framework, sobre todo si trabajamos sobre código manejado, suelen resultar muchas veces frustrantes, frustantes en el sentido de que algo que podíamos hacer de una manera sencilla en cualquier aplicación de escritorio no funciona de igual modo en la plataforma móvil.

Una de esas cosas, que de paso utilizo para el ejemplo, es poder enlazar el evento Click de un elemento MenuItem del cual desconozco su método asociado (en este caso OnClick), desde una función en código.

Lo más sencillo sería, venga va, si tienes el código fuente pues no seas desastre y mira el método que tienes asociado al evento click del MenuItem y a correr… está claro que es lo más sencillo ¿no? Pero si estás desarrollando un control que requiere ejecutar lo que el desarrollador enlace al evento Click del MenuItem la cosa se complica. Resulta que el método OnClick del MenuItem en Compact Framework esta declarado internamente como «Protected Internal vitual» así que nos olvidamos de poder invocarlo… y tampoco podemos recuperar el EventHandle al que esta asociado el evento Click del MenuItem.

Código interno del metodo OnClick dentro del control MenuItem

protected internal virtual void OnClick(EventArgs e)
{
    if (this.Click != null)
    {
        this.Click(this, e);
    }
}

Pues utilizando un poquito de reflection, podemos asociar el evento a nuestro propio código utilizando tan solo unas líneas de código.

En el ejemplo estamos asociando que cuando se dispare nuestro metodo, al que hemos llamado quickMenuItem.click, se ejecute también el método OnClicK del MenuItem que pasemos por código y por consiguiente se dispare el EventHandle asociado al click del MenuItem

using System.Reflection;
(…)
//Creamos un EventHandler y lo instanciamos con la definición del evento Click del menuItem que deseemos
EventHandler click = (EventHandler)GetPrivateField(menuItemX, «Click»);
quickMenuItem.Click += click;
(…)

//Recuperamos el campo privado a enlazar
private object GetCampoPrivado(object obj, string campo)
{

      //Prestar especial atención a los atributos
      FieldInfo fi = obj.GetType().GetField(campo, BindingFlags.NonPublic|BindingFlags.GetField|BindingFlags.Instance);
      return fi.GetValue(obj);
}

Esto es realmente sencillo, y nos muestra que muchas de las limitaciones con las que nos encontramos tienen una fácil solución.

NOTA: Una herramienta (comunmente concida) que realmente nos puede ayudar es la Red Gate’s .NET Reflector a la hora de descubrir métodos eventos y propiedades privadas.

Un saludo a todos.

José Antonio Gallego

Mobile .NET Users Group

[Mobile World Congress 2009] Microsoft Recite

Una novedad a destacar ha sido el anuncio de Microsoft Recite, esta tecnología nos permite desde nuestros dispositivos móviles, almacenar notas de voz y realizar búsquedas de las mismas, y todo ello utilizando solo la voz, esta herramienta es muy útil sobre todo si solemos dejarnos mensajes de voz para apuntar reseñas, ideas, tareas etc etc y al final del día no volvernos locos buscando entre todas las grabaciones.

 

clip_image001[5]clip_image001clip_image001[7]

 

Como en este tipo de historias suelo ser algo escéptico, no e podido evitar descargar la aplicación (por el momento gratuita) y comenzar a probarla, y la verdad es que tras la prueba no tiene mala pinta (a pesar de haber hecho la prueba con un dispositivo que no aparece en la lista de aptos), hemos probado a hacer unas cuantas grabaciones con dos voces distintas, y a realizar después búsquedas la verdad es que es resultado a sido más que aceptable, ahora solo falta que nos permitan incorporar esta tecnología a nuestros propios desarrollos 😛

Como no todo puede ser de color de rosa, tras las pruebas nos encontramos con lo que se podrían considerar fallos dediseño, tales como NO poder poner un nombre a tus grabaciones, y el echo de que funcione como si se tratase de un SmarthPone (no funciona la pantalla tactil) hace pensar que habrá en breve una nueva versión de esta aplicación, una que al menos siga los propios consejos de microsoft sobre buenas prácticas, al menos las de usabilidad….

Un saludo

José Antonio Gallego

Mobile .NET Users Group

[Mobile World Congress 2009] Nuevo escaparate para aplicaciones móviles, Windows® Marketplace for Mobile

Por fin ha llegado, el famoso y anunciado SkyMarket, un lugar desde donde poder acceder a un catalogo de aplicaciones para nuestros pequeños amigos. Y, es que, aunque suena igual a lo que la competencia directa lleva haciendo ya un tiempo (Vease Apple Iphone y Android)… bueno pues es lo mismo pero para Windows Mobile, por el momento y a la espera de poder probarlo parece que solo vendrá de serie para los nuevos dispositivos dotados con Windows Mobile 6.5.

Este nuevo servicio nos permitirá buscar y comprar aplicaciones desde el PC o directamente desde nuestro dispositivo Windows Phone (adiós a los Windows Mobile powered devices) y todo esto utilizando nuestra cuenta Windows Live ID. Este nuevo servicio permitirá a los desarrolladores de aplicaciones colgar sus aplicaciones (previo test por parte de Microsoft de la aplicación)

Por el momento no os molestéis en probarlo (a fecha de hoy) el servicio aun no está disponible aunque se prevé que esté listo a mediados de este año (y que nuestros ojos lo vean claro…) ya que no podremos disponer de estos dispositivos hasta Septiembre de este año (bueno salvo que visitéis este enlace, Flasheando la PDA con Windows Mobile 6.5)

 

Screen01 Screen02

Aquí las capturas para ver…. que no funciona aun…

Desde mi punto de vista esto es un anuncio que llega un poco tarde… aunque peor hubiese sido que no hubiese llegado nunca, y aunque desde septiembre de 2008 ya se rumoreaba sobre este tema no estaba claro que se anunciase para WM6.5