Carlos Blog

Carlos Blog

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

Deja un comentario

Please log in using one of these methods to post your comment:

Logo de WordPress.com

You are commenting using your WordPress.com account. Log Out / Cambiar )

Twitter picture

You are commenting using your Twitter account. Log Out / Cambiar )

Facebook photo

You are commenting using your Facebook account. Log Out / Cambiar )

Connecting to %s

Seguir

Get every new post delivered to your Inbox.