Personalizar Taskbar Windows 7 (I). Overlay Icons

Dado que apenas quedan unos meses para que Windows 7 “se encuentre definitivamente entre nosotros”, vamos a ir viendo algunas características interesantes que presenta este nuevo sistema operativo. Estas características o funcionalidades no son sólo atractivas desde el punto de vista de desarrollo sino también para el propio usuario, ya que tienen como objetivo facilitar y simplificar el trabajo diario.

El ejemplo que vamos a ver a continuación se trata de mostrar una serie de iconos sobre nuestra aplicación minimizada. Y la pregunta es ¿Para que nos sirve esto? Podemos utilizar los iconos para indicar el estado en que se encuentra una aplicación o un archivo, para marcar el tipo de contenido de una carpeta…

taskbar1

A través del listbox que aparece en la imagen, podemos seleccionar los distintos iconos que se muestran de manera que si activamos el checkbox “Show selected icon as overlay”, el icono que se encuentre seleccionado, aparecerá sobre el  icono de nuestra aplicación, cuando esta se encuentra minimizada. A continuación podemos ver alguno de los ejemplos:

taskbar2 taskbar3 taskbar4
 

Una vez visto esto vamos a entrar en el código de la aplicación. Creamos nuestro proyecto de tipo Windows Forms, y añadimos las referencias al Windows API Code Pack, previamente instalado en nuestro equipo. A continuación añadimos un control de tipo WPF, y los recursos que vayamos a utilizar, y pasamos a programar dicho control.

Por un lado está el archivo .xaml, donde definiremos las características gráficas del control y cuyo código debe ser el siguiente:
  1. <UserControl x:Class="TaskBarIcons.OverlayIcons"
  2.              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.              xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  5.              xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  6.              mc:Ignorable="d"
  7.              xmlns:local="clr-namespace:TaskBarIcons">
  8.     <UserControl.Resources>
  9.         <local:IconToBitmapSourceConverter x:Key="IconToBitmapSourceConverter" />
  10.         <DataTemplate x:Key="ImageTemplate">
  11.             <Grid>
  12.                 <Image Source="{Binding Converter={StaticResource IconToBitmapSourceConverter}, Mode=Default}"/>
  13.             </Grid>
  14.         </DataTemplate>
  15.         <ItemsPanelTemplate x:Key="ItemsPanelTemplate1">
  16.             <VirtualizingStackPanel IsItemsHost="True" Orientation="Horizontal"/>
  17.         </ItemsPanelTemplate>
  18.         <SolidColorBrush x:Key="ListBoxItemUnselected" Color="#002685E2" />
  19.         <SolidColorBrush x:Key="ListBoxItemSelected" Color="#FF2685E2" />
  20.         <Style x:Key="ListBoxItemStyle1" TargetType="{x:Type ListBoxItem}">
  21.             <Setter Property="Background" Value="Transparent"/>
  22.             <Setter Property="HorizontalContentAlignment" Value="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
  23.             <Setter Property="VerticalContentAlignment" Value="{Binding VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
  24.             <Setter Property="Padding" Value="2,0,0,0"/>
  25.             <Setter Property="Template">
  26.                 <Setter.Value>
  27.                     <ControlTemplate TargetType="{x:Type ListBoxItem}">
  28.                         <Border x:Name="Bd" SnapsToDevicePixels="true"
  29.                     Background="{TemplateBinding Background}"
  30.                     Padding="{TemplateBinding Padding}" HorizontalAlignment="Center"
  31.                     VerticalAlignment="Center"
  32.                     BorderBrush="{DynamicResource ListBoxItemUnselected}" BorderThickness="2">
  33.                             <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
  34.                         </Border>
  35.                         <ControlTemplate.Triggers>
  36.                             <Trigger Property="IsSelected" Value="true">
  37.                                 <Setter Property="BorderBrush" TargetName="Bd" Value="{DynamicResource ListBoxItemSelected}"/>
  38.                             </Trigger>
  39.                             <Trigger Property="IsEnabled" Value="false">
  40.                                 <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
  41.                             </Trigger>
  42.                         </ControlTemplate.Triggers>
  43.                     </ControlTemplate>
  44.                 </Setter.Value>
  45.             </Setter>
  46.         </Style>
  47.     </UserControl.Resources>
  48.     <Grid>
  49.         <Grid Margin="2" Width="200" VerticalAlignment="Top">
  50.             <Grid.RowDefinitions>
  51.                 <RowDefinition Height="Auto" />
  52.                 <RowDefinition Height="*" MinHeight="50"/>
  53.                 <RowDefinition Height="Auto" />
  54.                 <RowDefinition Height="Auto" />
  55.             </Grid.RowDefinitions>
  56.             <Rectangle Style="{DynamicResource BorderStyle}" Grid.RowSpan="4" />
  57.             <TextBlock Text="Overlay Icons"
  58.                  Margin="{DynamicResource BoxedContentMargin}"
  59.                  Style="{DynamicResource SectionTitle}" />
  60.             <ListBox x:Name="iconsList"
  61.                Margin="{DynamicResource BoxedContentMargin}"
  62.                Grid.Row="1" ItemTemplate="{DynamicResource ImageTemplate}"
  63.                ItemsPanel="{DynamicResource ItemsPanelTemplate1}"
  64.                ItemContainerStyle="{DynamicResource ListBoxItemStyle1}"
  65.                SelectionChanged="iconsList_SelectionChanged" />
  66.             <CheckBox x:Name="ShowOverlay" Click="ShowOverlay_Click" Grid.Row="2"
  67.                 Margin="{DynamicResource BoxedContentMargin}">
  68.                 <TextBlock Text="Show selected icon as overlay" TextWrapping="Wrap" />
  69.             </CheckBox>
  70.         </Grid>
  71.     </Grid>
  72. </UserControl>
  73.  
  74. </form>

Por otro lado el archivo .cs, donde definiremos la lógica de funcionamiento del mismo y cuyo código será:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.Globalization;
  5. using System.Windows;
  6. using System.Windows.Controls;
  7. using System.Windows.Data;
  8. using System.Windows.Media.Imaging;
  9. using Microsoft.WindowsAPICodePack.Taskbar;
  10.  
  11. namespace TaskBarIcons
  12. {
  13.     /// <summary>
  14.     /// Interaction logic for UserControl1.xaml
  15.     /// </summary>
  16.     public partial class OverlayIcons : UserControl
  17.     {
  18.         public OverlayIcons()
  19.         {
  20.             InitializeComponent();
  21.             this.Loaded += Overlays_Loaded;
  22.             this.Unloaded += Overlays_Unloaded;
  23.         }
  24.         private void Overlays_Unloaded(object sender, RoutedEventArgs e)
  25.         {
  26.             TaskbarManager.Instance.SetOverlayIcon(null, null);
  27.         }
  28.  
  29.         private void Overlays_Loaded(object sender, RoutedEventArgs e)
  30.         {
  31.             if (this.iconsList.ItemsSource == null)
  32.             {
  33.                 this.iconsList.ItemsSource = OverlayIcons.Icons;
  34.             }
  35.             else
  36.             {
  37.                 ShowOrHideOverlayIcon();
  38.             }
  39.         }
  40.  
  41.         static List<Icon> _icons;
  42.         public static List<Icon> Icons
  43.         {
  44.             get
  45.             {
  46.                 if (_icons == null)
  47.                 {
  48.                     _icons = new List<Icon>()
  49.                     {
  50.                        
  51.                         TaskBarIcons.Resources.Discussion,
  52.                         TaskBarIcons.Resources.Mail,
  53.                         TaskBarIcons.Resources.Add_Appointment,
  54.                         TaskBarIcons.Resources.Add_To_Favorite,
  55.                         TaskBarIcons.Resources.Desktop,
  56.                         TaskBarIcons.Resources.Movie_CD,
  57.                         TaskBarIcons.Resources.Mr__Bomb,
  58.                         TaskBarIcons.Resources.Smiley_Star_Pink
  59.  
  60.                     };
  61.                 }
  62.                 return _icons;
  63.             }
  64.         }
  65.  
  66.         private void ShowOverlay_Click(object sender, RoutedEventArgs e)
  67.         {
  68.             ShowOrHideOverlayIcon();
  69.         }
  70.  
  71.         private void iconsList_SelectionChanged(object sender, SelectionChangedEventArgs e)
  72.         {
  73.             ShowOrHideOverlayIcon();
  74.         }
  75.  
  76.         //The following method is part of the lab. If we are asked to show an
  77.         //overlay icon, use the TaskbarManager.SetOverlayIcon method to set it.
  78.         //Use the same method with a null icon to reset it, so that no icon is
  79.         //displayed.
  80.         private void ShowOrHideOverlayIcon()
  81.         {
  82.             if (ShowOverlay.IsChecked.Value)
  83.             {
  84.                 Icon icon = iconsList.SelectedItem as Icon;
  85.                 if (icon != null)
  86.                     TaskbarManager.Instance.SetOverlayIcon(icon, "icon" + iconsList.SelectedIndex.ToString());
  87.             }
  88.             else
  89.             {
  90.                 TaskbarManager.Instance.SetOverlayIcon(null, null);
  91.             }
  92.  
  93.         }
  94.  
  95.     }
  96.     public class IconToBitmapSourceConverter : IValueConverter
  97.     {
  98.         #region IValueConverter Members
  99.  
  100.         public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
  101.         {
  102.             Icon icon = value as Icon;
  103.             if (icon != null)
  104.             {
  105.                 BitmapSource bitmap = System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon(
  106.                     icon.Handle, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
  107.                 return bitmap;
  108.             }
  109.             return value;
  110.         }
  111.  
  112.         public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
  113.         {
  114.             throw new NotImplementedException();
  115.         }
  116.  
  117.         #endregion
  118.     }
  119.  
  120. }

 

Si queremos aprovechar otras de las características que presenta Windows 7, existe un kit de entrenamiento que podemos descargar aquí, y en el cual encontramos numerosos tutoriales para crear distintas aplicaciones.

 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *