Chronos: Jugando con la barra de tareas de Windows 7


Hacía tiempo que quería ver un poco como funciona la integración desde una aplicación de WPF con la barra de tareas de Windows 7, así que para probar un poco como funciona he implementado una lista de vista abiertas recientemente en Chronos. Para la integración con la barra de tareas de Windows 7 he utilizado las clases que están en el namespace System.Windows.Shell (de .NET 4.0).

Aprovechando le he echado un vistazo también al “Messaging Broker” que viene con nRoute (que me parece muy muy interesante).

Como lo que se pretende es generar una lista de las operativas abiertas recientemente, lo que he hecho has sido modificar el servicio de navegación para que publique un mensaje en un canal a través del sistema de mensajeria de nRoute

// Publish the navigation message
Channel<NavigationInfo>.Manager.PublishAsync(
new NavigationInfo
(
response.Request.Url,
response.NavigationStateManager.Title
));

La clase NavigationInfo nos servirá como “payload” del mensaje para notificar la URL de la vista y un texto para visualizar en la JumpList

public sealed class NavigationInfo
{
    #region · Fields ·

    private string navigationUri;
    private string displayName;

    #endregion

    #region · Properties ·

    public string NavigationUri
    {
        get { return this.navigationUri; }
    }

    public string DisplayName
    {
        get { return this.displayName; }
    }

    #endregion

    #region · Constructors ·

    internal NavigationInfo(string navigationUri, string displayName)
    {
        this.navigationUri  = navigationUri;
        this.displayName    = displayName;
    }

    #endregion
}

Para recibir el mensaje he implementado un suscriptor dedicado de nRoute, NavigationObserver

[MapChannelObserver(typeof(NavigationInfo),
    InitializationMode = InitializationMode.WhenAvaliable,
    Lifetime = InstanceLifetime.Singleton,
    ThreadOption = ThreadOption.UIThread)]
public sealed class NavigationObserver : nRoute.Components.IObserver<NavigationInfo>

que se encargará de comprobar si la plataforma en la que está ejecutándose la aplicación es Windows 7 y en tal caso añadir la vista a una JumpList personalizada (en el caso de que no exista)

if (App.RunningOnWin7)
{
    JumpList jl = JumpList.GetJumpList(Application.Current);

    if (jl != null)
    {
        if (jl.JumpItems.Count >= 10)
        {
            jl.JumpItems.Clear();
        }

        var q = jl.JumpItems.OfType<JumpTask>().Where(t => t.Arguments.Equals(value.NavigationUri));

        if (q.Count() == 0)
        {
            JumpList.GetJumpList(Application.Current).JumpItems.Add
            (
                new JumpTask
                {
                    CustomCategory      = "Reciente",
                    Title               = value.DisplayName,
                    Arguments           = value.NavigationUri,
                    IconResourcePath    = null,
                    IconResourceIndex   = -1,
                    Description         = null,
                    WorkingDirectory    =
                        Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)
                }
            );

            jl.Apply();
        }
    }
}

de los posts en blogs que he visto sobre la barra de tareas de Windows 7 todos (o casi) tienen como ejemplo de las JumpList la ejecución de aplicaciones externas, que es el caso más sencillo, en este caso lo que se necesita es que la aplicación capture la acción que el usuario hace sobre uno de los elementos de la JumpList y abra la vista correspondiente.

El mejor ejemplo de como hacerlo lo he visto en la aplicación Fishbowl, en su clase SingleInstance, utilizan Remoting y IPC para conseguirlo.

Y aquí va un pantallazo de como se ve la JumpList

image

About these ads

Deja un comentario

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s