Novedades SharePoint Designer 2010

Desde este lunes  16 de Noviembre, ya esta disponible la Beta de SharePoint 2010 para suscriptores  de MSDN y Technet ¡¡y en español!! . Además, también podemos obtener la beta de SharePoint Designer (SPD) 2010, pero esta última, de manera gratuita al igual que su versión anterior.

En este post veremos las “Top Ten ” novedades que introduce SPD 2010 con respecto a sus versiones anteriores, tal y como se comento en el Tech Ed EMEA.

Versiones Anteriores                                   Versión actual

image                  image

 

Antes de comenzar con las nuevas características que presenta esta aplicación, decir que esta pensada para:

– Administradores de sitios y usuarios no técnicos que necesiten modelar escenarios de negocio sin código.

– Desarrolladores y administradores que tengan la necesidad de construir rápidamente soluciones.

Y , que como es lógico, esta herramienta sólo es compatible con SharePoint 2010, y no con versiones previas.  En cuanto a las características que presenta:                     

1. Se puede restringir, desde la administración central, los permisos para el uso de SPD:

– Central Admin -> General Application Settings -> SharePoint Designer Settings

2. Nueva experiencia de usuario:

– Se introduce el Ribbon, como en versiones Office 2007

– Se sustituye la organización en base a carpetas, por una organización lógica de elementos, de forma que la navegación es más intuitiva (quick lunch navigation).

image  image

3. Se puede crear de forma sencilla el contenido de SharePoint a través del BackStage introducido en Microsoft Office System 2010: listas, páginas, subsitios, etc.

4. Se puede crear de forma sencilla contenido de SharePoint a través del backstage de Office 2010: listas, páginas, subsitios, etc.-Se puede configurar la seguridad del sitio a nivel de grupos y niveles de servicios.

 

image image

5. Se pueden crear nuevos tipos de contenido y agregarlos a listas de manera directa.

6. Se pueden crear Site Assets para almacenar archivos necesarios para los sitios.

image image

7. Se sustituyen las Listview WebPart por XSLT ListView WebParts

– Se pueden manipular fácilmente in SPD y desde el navegador

8. Se puede conectar con fuentes de datos fuera de SharePoint:

– Archivos XML

– Bases de datos

– Servicios web…

image image

9. Permite crear tipos de contenido de negocio mediante los “External Content Types” que forman parte de los Business Connectivity Services (BCS)y  cuya función es similar al funcionamiento del catalogo de servicios profesionales.

10. Permite crear potentes workflows  a nivel de:

– lista

– sitio

– reusables (se pueden exportar y utilizar en otros sitios)

image image

Y de momento, “That’s all folks”

Office 2010 Client

Al igual que todos los años por estas fechas, esta semana se esta celebrando el Tech-Ed EMEA, que coincidiendo con el 20 aniversario de la caída del muro de Berlín tiene lugar en esta misma ciudad.

blog

En este evento se presentan las novedades de algunos productos que Microsoft tiene todavía en el "horno".  Y uno de ellos, es SharePoint 2010. Del que me oiréis hablar durante estos días, para no variar….

Sin embargo, empezaré hablando de otro tema: Office 2010, el paquete de aplicaciones cliente de Microsoft Office System. Este consta de los mismos programas que en su versión anterior, pero estos presentan una interfaz de usuario mejorada (nuevo ribbon), así como nuevas características.

A continuación veremos algunos ejemplos de dichas características, a nivel particular:

Excel:

– Se pueden generar sparklines en tiempo real

sparklines

– Permite trabajar con Pivot Tables en tiempo real, combinado con Power Pivot 

Word:

– Opción de previsualización al copiar texto, o imágenes (3 opciones). Por ejemplo al copiar texto desde una página web

opcionespegado

– Ofrece opciones de edición de imágenes avanzadas(fondo, efectos artísticos, texturas…)

efectos_imagenes 

– Cuando se trabaja con documentos en el servidor, sólo se envía aquellos párrafos que han sido modificados, por lo tanto se reduce el peso de los archivos

A nivel general el paquete de Office 2010 presenta como novedad, lo que se conoce como Backstage, que se trata de una página de información complementaria, como la que se observa en la siguiente imagen:

Y que nos permite:

– "rastrear"el contenido de un documento

-  gestionar versiones de documentos

– Se pueden generar snapshoots de forma directa

– saber la ruta exacta del archivo de manera sencilla

– ver las persona que están trabajando en un documento (el propietario, quien lo tiene bloqueado…)

Otra de las características que presentan todos estos programas es la posibilidad de crear snapshoots de los archivos con los que estamos trabajando.

cappantalla

Para obtener más información es recomendable visitar los siguiente enlaces:

http://www.office2010themovie.com/

http://www.microsoft.com/office/2010/

PowerPoint:

– Permite insertar video de manera sencilla  arrastrándolo a las slides

– Permite editar video (añadir créditos, cortarlo, añadir frames, cambiar los colores del mismo…)

– Se puede comprimir el video para compartirlo

– Se puede visualizar el video con gran fidelidad en sitios SharePoint

Outlook:

– Presenta previsualización del calendario

– Email de voz

– Nuevas tarjetas de contacto

– Se puede conectar con Exchange para mostrar el estado de una persona

– Ofrece “quick steps” para crear nuevos contactos, clientes…

 

A nivel de servidor todos estos programas se combinan a la perfección con SharePoint 2010 ya que:

 

– Presenta una interfaz de usuario enriquecida-> ribbon

– Los podemos visualizar en tiempo real

– Se renderizan de la misma manera que lo hacen en sus aplicaciones de origen(Wor, Excel, PowerPoint) por lo que no se observa ningún tipo de diferencia.

– Se visualizan de igual forma en Firefox

– No es necesario utilizar ningún tipo de control Active X para implementarlos

– Permiten múltiples usuarios al mismo tiempo

 

Pero tendremos que esperar hasta que podamos probar estas nuevas características…¡¡¡aunque no será por ganas!!!

Crear Query CAML a partir de un parámetro variable

Hace unos meses ya comente la existencia de algunas herramientas que nos permiten realizar Querys sobre listas SharePoint de manera sencilla, entre ellas CAMLQueryBuilder de u2u. Recientemente me ha tocado trabajar con ella y la verdad que para ser una herramienta gratuita es bastante completa…pero también tiene sus agujeros.

Tratando de realizar un filtrado en una de nuestras listas a partir de un parámetro variable, en lugar de un valor concreto, hemos tenido bastantes complicaciones, ya que dicha herramienta no nos permitía introducir un parámetro definido externamente por código. En concreto queríamos filtrar un campo de nuestra lista llamado “Dia” de tipo DateTime, para poder volcar aquellos elementos que coincidieran con una fecha variable seleccionada a partir de un calendario. Dado los problemas que nos ocasionaba que el campo de nuestra lista fuera de tipo DateTime (ya que no sabíamos exactamente con que formato interpreta SharePoint estos elementos) decidimos cambiarlo a tipo Texto. De esta manera conseguimos que nuestra consulta funcionara de la siguiente manera:

SPQuery oQueryHoras = new SPQuery();
        oQueryHoras.Query = "<Where><Eq><FieldRef Name=’Dia’/><Value Type=’Text’>" + CalendarioTrabajo.SelectedDate.ToString("dd/MM/yyyy")
            + "</Value></Eq></Where>"; //Pasamos el parámetro (fecha seleccionada en el calendario) transformado a formato "dd/MM/yyyy" y utilizamos (+) para concatenar

Por otro lado, cuando creamos vistas personalizadas en SharePoint, podemos hacer filtros para que cada usuario sólo pueda ver aquellos elementos de una lista que han sido creados o modificados por el. Para ello lo único que tenemos que hacer es indicar:

filtrouserme

Pero si realizamos este mismo filtrado mediante una Query CAML, esto no funciona. ¿Cómo solucionamos esto? Buscando información en la red encontré dos sitios donde explicaban como tenía que ser nuestra Query para que esto funcione correctamente:

http://www.davehunter.co.uk/Blog/Lists/Posts/Post.aspx?ID=123

http://vspug.com/mirjam/2009/07/16/creating-a-custom-view-that-filters-on-the-current-user-or-me/

Y el código necesario es el siguiente siguiente:

<Where><Eq><FieldRef Name=’Author’/><Value Type=’Integer’><UserID Type=’Integer’/></Value></Eq></Where>

De forma que nuestra consulta final, que filtra por dia y persona, quedó de la siguiente manera:

"<Where><And><Eq><FieldRef Name=’Dia’/><Value Type=’Text’>" + CalendarioTrabajo.SelectedDate.ToString("dd/MM/yyyy")
            + "</Value></Eq><Eq><FieldRef Name=’Author’/><Value Type=’Integer’><UserID Type=’Integer’/></Value></Eq></And></Where>";

Espero que os haya resultado de ayuda esta información 😉

Página de administración de Web Parts

Muchas veces, trabajando en el desarrollo de Web Parts personalizados, nos encontramos con el problema de que al intentar implementarlos en un sitio SharePoint no podemos debido a algún tipo de error. Además, una vez implementados, tampoco podemos eliminarlos para corregir dicho error ya que no podemos acceder directamente hasta ellos. ¡¡O eso es lo que pensamos!!

La mayoría de la gente que comienza a desarrollar aplicaciones para SharePoint no sabe que existe una página de mantenimiento de Web Parts, que nos permite gestionar el mantenimiento de nuestra página de elementos web y por lo tanto también nos permite eliminar aquellos elementos que nos están ocasionando problemas. Por defecto esta página no esta visible para ninguno de los usuarios del sitio. Para acceder a ella lo único que tenemos que hacer es añadir al final de la URL, que nos esta dando problemas, el siguiente texto " ?contents=1 ", de manera que entraremos a una página similar a la que se observa en la imagen y que nos va permitir gestionar de manera sencilla todos los elementos web de nuestra página en cuestión.

 

image

Microsoft Web Platform Installer 2.0

Con la mejora de la experiencia de usuario como tema central, el pasado 24 de Septiembre tuvo lugar en Madrid el evento reMIX, donde se vieron algunas de las novedades sobre Silverlight 3, Expression 3, desarrollo para Windows 7 y mucho más. Toda la documentación del evento: presentaciones, aplicaciones.. están disponibles aquí ¡¡para nuestro disfrute!!.

logoremix

En mi opinión, una de las cosas más interesante que se presento en dicho evento es Web Platform Installer 2.0. Se trata de un paquete gratuito elaborado por Microsoft y soportado en 9 idiomas, que contiene las partes o componentes fundamentales de una plataforma Web de Microsoft. Incluye IIS (Internet Information Services), SQL Server 2008 Express Edition, .NET Framework, y Visual Web Developer 2008. Además permite instalar aplicaciones Web gratuitas para blogs, gestión de contenidos, etc, e incluso PHP, como se puede observar en las siguientes imágenes:

image image image

Por lo tanto se trata de un producto especialmente útil para la comunidad de desarrolladores o para todas aquellas personas que se quieran iniciar en el mundo del desarrollo web. Ya que esta permite instalar y personalizar el software necesario para desarrollar o desplegar sitios y aplicaciones web de manera sencilla. Básicamente, la herramienta analiza que tiene el sistema instalado, y nos muestra todos aquellos componentes que no están en nuestro equipo y que podemos instalar, evitando tener que hacerlo manualmente.

Si todavía no os lo habéis descargado desde aquí os animo a que lo hagáis. 😉

Indexación de archivos y uso de IFilters en SharePoint

Siguiendo con el tema de las búsquedas en SharePoint vamos a ver como indexamos los archivos .rar (o cualquier otro tipo de contenido) para que aparezcan en el resultado de nuestras búsquedas. Para ello es necesario utilizar los IFilters específicos de cada tipo de archivo, en nuestro caso el que vamos a utilizar es este. Los IFilters son unos plugins que se utilizan para realizar la indexación de Windows (Windows Indexing Service) y que permiten “entender” el contenido y las propiedades de los distintos archivos con los que trabajamos. De forma que SharePoint se beneficia del uso de estos plugins para obtener unos resultados mucho más precisos en las búsquedas.

Una vez descargado el IFilter correspondiente, lo instalamos. A continuación abrimos la central de Administración de SharePoint. Dentro de los Servicios Compartidos (Shared Services), vamos al apartado Búsqueda > Configuración de Búsquedas > Tipos de archivo > Nuevo tipo de archivo. Y añadimos la extensión rar

image

image

Para que los nuevos tipos de archivos aparezcan en los resultados de nuestras búsquedas, es necesario parar y volver a iniciar las búsquedas. Esto último lo hacemos a través de la consola de comandos, ejecutando:

net stop spsearch

net start spsearch

Y además, es bastante aconsejable realiza un nuevo rastreo total mediante los siguientes comandos:

stsadm –o spsearch –action fullcrawlstart

stsadm –o spsearch –action fullcrawlstop

Ya que sino las modificaciones no se verán hasta que se realice el próximo rastreo incremental que tengamos programado.

Como se puede ver en la siguiente imagen, al realizar la búsqueda del archivo .rar, la indexación se ha realizado de manera correcta, ya que nuestro archivo aparece en las búsquedas, y con su icono correspondiente. 

image 

Si queremos añadir cualquier otro tipo de archivos y que estos aparezcan dentro de nuestras búsquedas, aquí podemos ver una lista de las fuentes donde podemos encontrar todos los IFilters que se pueden usar.

Obtener informes de uso de un sitio SharePoint

Para poder obtener informes sobre el uso de nuestro sito SharePoint es necesario habilitar previamente  el registro de uso de Windows SharePoint Services y el procesamiento del análisis de uso de Office SharePoint. Para ello vamos a la central de Administración y en la pestaña Operaciones > Crear registros e informes > Procesamiento del análisis de uso habilitamos ambas características, indicando: el número de archivos de registro que se desean crear, así como las horas en las que se realizará el procesamiento del análisis de uso.

Una vez hecho esto debemos activar la característica de nuestra colección de sitios. Para ello dentro de nuestro portal vamos a Acciones del sitio > Configuración del sitio > Administración de la colección de sitios > Características de la colección de sitios, y activamos la opción Crear informes. De esta manera ya esta configurado todo lo necesario para poder generar dichos informes. ¿Pero donde los podemos ver? Pues es muy sencillo, lo único que tenemos que hacer es ir dentro de nuestro sito a Acciones del sitio > Configuración del sitio > Administración de la colección de sitios > Informes de uso de la colección de sitios. Y veremos lo siguiente:

image 

Sin embargo, a parte de esta información podemos obtener otro tipo de informes de uso de nuestro sitio mediante una URL oculta. Dicha URL es la siguiente: http://{nombre del portal}/_layouts/usageDetails.aspx. A través de ella podemos obtener informes sobre las páginas visitadas, los usuarios, el sistema operativo utilizado, explorador de acceso o la URL de referencia.

image

Sin embargo en muchas ocasiones este tipo de estadísticas no son todo lo especificas que nos gustaría. Por ejemplo a nivel de usuario, no nos dan información sobre el tiempo de estancia en un sito o el volumen de los contenidos visitados en cada estancia…etc

Para obtener este tipo de información existen otro tipo de aplicaciones, pero de pago. ¡¡Algún PERO tenía que tener!!. Un ejemplo bastante interesante es MapiLab.

Configurar SharePoint para ver iconos de archivos (.rar, pdf…)

Hoy vamos ver un tema sencillo pero interesante, cómo configurar SharePoint para ver iconos de archivos que no pertenecen a aplicaciones Microsoft.

SharePoint reconoce los iconos de los formato propios de Microsoft pero si trabajamos con otro tipo de archivos como pueden ser pdfs o winrars en lugar de ver el tipo (icono), vemos una especie de página en blanco.

image 

Para poder ver el tipo de archivo con el que estamos trabajando, debemos añadir los iconos de los mismos para que el propio sistema los asocie. Para ello lo que hacemos es descargar el icono de la aplicación (tamaño 16×16) que llamamos icrar.gif, y lo añadimos en la ruta : C:Program FilesCommon FilesMicrosoft Sharedweb server extensions12TEMPLATEIMAGES.

A continuación debemos modificar el documento DOCICON.xml que es el que se encarga de mapear las distintas extensiones de formato con sus iconos correspondientes, y que ese encuentra en la ruta C:Program FilesCommon FilesMicrosoft Sharedweb server extensions12TEMPLATEXML. Bajo la etiqueta <ByExtension> añadimos <Mapping Key="rar" Value="icrar.gif"/>

Por último debemos reiniciar el iis para que que se actualicen las modificaciones. Abrimos la consola de comandos y ejecutamos iisreset.

image

Este mismo procedimiento se seguirá para añadir cualquier otro tipo de archivos.

Hasta este punto todo correcto. Pero ¿que pasa si realizamos una búsqueda de este tipo de archivos? Estos no aparecen en los resultados ya que los nuevos formatos introducidos no se encuentra definidos en las propiedades de la búsqueda, ni tampoco se encuentran indexados para su rastreo.

En otro momento veremos como se implementa esta última parte.

Trabajar con las Shell Libraries en Windows 7

Una de las novedades que introduce Windows 7 a nivel de gestión de archivos, con respecto a sistemas operativos anteriores, es la organización de los mismos en bibliotecas temáticas. Con ello se pretende separar los distintos tipos de contenidos de manera que sea más fácil localizarlos y trabajar con ellos.

En la siguiente imagen se puede ver cual es la distribución establecida por defecto:

 

Esta distribución se puede personalizar, es decir, es posible crear nuevas bibliotecas con los contenidos específicos que nosotros deseemos. A nivel de usuario, esto se puede hacer de manera sencilla mediante la opción Nueva Biblioteca que nos aparece en la parte superior del explorador cuando hacemos clic sobre Bibliotecas.

Pero en nuestro caso nos interesa ir un poco más allá y ver como se puede explotar la funcionalidad de las bibliotecas desde el punto de vista del desarrollador. Para ello vamos a ver cómo podemos programar una aplicación para Windows 7 de manera que se automatice este proceso. Esto puede ser útil cuando nos interese, por ejemplo, redirigir un tipo de contenido específico de nuestra organización (compras) a una ubicación concreta y predefinida.

Pero ¿que es lo primero que tenemos que hacer?Al igual que para trabajar con la TaskBar, se necesita agregar a nuestro proyecto las referencias especificas que nos permitan trabajar con las características de Windows 7 ( Microsoft.WindowsAPICodePack y Microsoft.WindowsAPICodePack.Shell, que forman parte del WindowsAPICodePack. En mi caso no las he utilizado, ya que he reutilizado una aplicación iniciada hace unos meses y en la que utilizaba la VistaBridgeLibrary. Decir que, entre ambas, existen diferencias en cuanto a los nombres de los métodos que se utilizan, pero que el “fundamento” es el mismo. 

A continuación lo que vamos a ver es una aplicación básica que nos permite crear nuevas bibliotecas e ir añadiendo contenido a ellas (en forma de carpetas).

 

Como se puede ver dicha aplicación es un Windows Form que consta de una serie de botones, cuadros de texto, labels…que nos permiten crear un sistema sencillo de gestión de bibliotecas.

1º Damos nombre a nuestra biblioteca, y la añadimos > Añadir Biblioteca

2º Indicamos si queremos añadir una carpeta a la biblioteca creada o a otra ( nombre) > Añadir Carpeta. Y seleccionamos la carpeta deseada mediante el explorador que se no despliega.

 

3º Indicamos si queremos eliminar una carpeta de la biblioteca creada o de otra(nombre) > Eliminar Carpeta. Y seleccionamos la carpeta deseada mediante el explorador que se no despliega.

Y el código utilizado para implementar esta aplicación es el siguiente:

 

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using Microsoft.SDK.Samples.VistaBridge.ShellLibrary;
  10. //nos permite trabajar con las ShellLibraries
  11.  
  12. namespace Libraries
  13. {
  14.     public partial class Form1 : Form
  15.     {
  16.         public Form1()
  17.         {
  18.             InitializeComponent();
  19.             //Personalizamos la ventana de nuestra apliación
  20.             this.Text = "Shell Libraries";
  21.             this.Icon = new Icon(Properties.Resources.windows7, new Size(100, 100));
  22.  
  23.         }
  24.  
  25.         private void AñadirBiblio_Click(object sender, EventArgs e)
  26.         {
  27.  
  28.             if (LibraryName.Text == "")//comprueba que se introduce un nombre para la biblioteca
  29.             {
  30.                 Creado.Text = "Debe introducir un nombre";
  31.  
  32.             }
  33.             else
  34.             {
  35.                 CreateLibrary(LibraryName.Text);//se crear la biblioteca con el nombre indicado
  36.                 Creado.Text = "* Biblioteca" + " " + LibraryName.Text + " " + "creada";//indicamos que biblioteca se crea
  37.  
  38.             }
  39.         }
  40.         public static void CreateLibrary(string name)
  41.         {
  42.             //se crea la biblioteca
  43.             using (ShellLibrary library = ShellLibrary.Create(name, true))
  44.             {
  45.  
  46.             }
  47.         }
  48.  
  49.         private void AñadirCarpeta_Click(object sender, EventArgs e)
  50.         {
  51.             FolderBrowserDialog folderAdd = new FolderBrowserDialog();//
  52.  
  53.             if (folderAdd.ShowDialog() == DialogResult.OK)
  54.             {
  55.                 if (radioButton1.Checked == true)//si
  56.                 {
  57.                     AddFolder(LibraryName.Text, folderAdd.SelectedPath);//añadimos la carpeta seleccionada a la biblioteca creada
  58.                     Añadida.Text = "*Se ha añadido la carpeta: " + "\n" + folderAdd.SelectedPath.ToString() + " a la biblioteca" + " " + LibraryName.Text;//indicamos que carpeta se añade a la biblioteca creada
  59.                 }
  60.                 else if (radioButton2.Checked == true)
  61.                 {
  62.                     AddFolder(OtherLibraries.Text, folderAdd.SelectedPath);//añadimos la carpeta seleccionada a cualquier biblioteca
  63.                     Añadida.Text = "* Se ha añadido la carpeta: " + "\n" + folderAdd.SelectedPath.ToString() + " a la biblioteca" + " " + OtherLibraries.Text;//indicamos que carpeta se añade a que biblioteca
  64.                 }
  65.  
  66.             }
  67.  
  68.         }
  69.         public static void AddFolder(string name, string folderPath)
  70.         {
  71.             //se añade una carpeta de una ShellLibrary
  72.             using (ShellLibrary library = ShellLibrary.Load(
  73.                          ShellLibrary.CreateLibraryFullName(name), true))
  74.             {
  75.                 library.AddFolder(folderPath);
  76.             }
  77.         }
  78.         public static void RemoveFolder(string name, string folderPath)
  79.         {
  80.             //se elimina una carpeta de una ShellLibrary
  81.             using (ShellLibrary library = ShellLibrary.Load(
  82.                     ShellLibrary.CreateLibraryFullName(name), true))
  83.             {
  84.                 library.RemoveFolder(folderPath);
  85.             }
  86.         }
  87.  
  88.         private void EliminarCarpeta_Click(object sender, EventArgs e)
  89.         {
  90.             FolderBrowserDialog folderRemove = new FolderBrowserDialog();
  91.             if (folderRemove.ShowDialog() == DialogResult.OK)
  92.             {
  93.                 if (radioButton4.Checked == true)
  94.                 {
  95.                     RemoveFolder(LibraryName.Text, folderRemove.SelectedPath);//eliminamos la carpeta seleccionada de la biblioteca creada
  96.                     Eliminada.Text = "* Se ha eliminado la carpeta: " + "\n" + folderRemove.SelectedPath.ToString() + " de la biblioteca" + " " + LibraryName.Text;
  97.                 }
  98.                 else if (radioButton3.Checked == true)
  99.                 {
  100.                     RemoveFolder(RemoveLibraries.Text, folderRemove.SelectedPath);//eliminamos la carpeta seleccionada de cualquie biblioteca
  101.                     Eliminada.Text = "* Se ha eliminado la carpeta: " + "\n" + folderRemove.SelectedPath.ToString() + " de la biblioteca " + "" + RemoveLibraries.Text;
  102.                 }
  103.  
  104.             }
  105.  
  106.         }
  107.  
  108.  
  109.  
  110.     }
  111. }

Personalizar Tasbar Windows 7(II). ProgressBar

Continuando con la temática de mi post anterior, hoy vamos a ver otra de las funcionalidades que se pueden aplicar a la barra de tareas de Windows 7. En esta ocasión veremos como mostrar una barra de progreso sobre el icono de nuestra aplicación mínimizada. De esta manera como su propio nombre indica veremos el progreso de la misma: activa, pausada, si se produce error, si esta pensando ….
 
Partiendo del proyecto anterior lo que hacemos es añadir un nuevo control WPF, cuyo código de definición es el siguiente:
 
  1. <UserControl x:Class="TaskBarIcons.ProgressBar"
  2.     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  4.     <Grid Width="300">
  5.         <Grid.RowDefinitions>
  6.             <RowDefinition Height="Auto" />
  7.             <RowDefinition Height="Auto" />
  8.             <RowDefinition Height="Auto" />
  9.             <RowDefinition Height="Auto" />
  10.             <RowDefinition Height="Auto" />
  11.             <RowDefinition Height="*" />
  12.         </Grid.RowDefinitions>
  13.         <Rectangle Style="{DynamicResource BorderStyle}" Grid.RowSpan="4" />
  14.         <TextBlock Text="Taskbar Progress" Margin="{DynamicResource BoxedContentMargin}" Style="{DynamicResource SectionTitle}" />
  15.         <DockPanel Grid.Row="1" Margin="{DynamicResource BoxedContentMargin}">
  16.             <TextBlock Text="Status" DockPanel.Dock="Left"></TextBlock>
  17.             <ComboBox x:Name="ProgressStateSelection" Margin="5,0,0,0" HorizontalAlignment="Stretch"
  18.                 SelectionChanged="ProgressStateSelection_SelectionChanged"/>
  19.         </DockPanel>
  20.         <Slider x:Name="progressSlider" MaxWidth="300" Height="40" Minimum="0" Maximum="100" Grid.Row="2"
  21.             ValueChanged="progressSlider_ValueChanged" Margin="{DynamicResource BoxedContentMargin}"/>
  22.         <CheckBox x:Name="ShowProgressBar" Click="ShowProgressBar_Click" Grid.Row="3"
  23.               Margin="{DynamicResource BoxedContentMargin}">
  24.             <TextBlock Text="Show slider's value in progress bar" />
  25.         </CheckBox>
  26.     </Grid>
  27. </UserControl>
  28.  
  29. </form>

Y cuya lógica de funcionamiento viene definida a través del siguiente código:

  1. using System;
  2. using System.Windows;
  3. using System.Windows.Controls;
  4. using Microsoft.WindowsAPICodePack.Taskbar;
  5.  
  6. namespace TaskBarIcons
  7. {
  8.     /// <summary>
  9.     /// Interaction logic for ProgressBar.xaml
  10.     /// </summary>
  11.     public partial class ProgressBar : UserControl
  12.     {
  13.         public ProgressBar()
  14.         {
  15.             InitializeComponent();
  16.             this.Loaded += ProgressBar_Loaded;
  17.             this.Unloaded += ProgressBar_Unloaded;
  18.         }
  19.         private void ProgressBar_Unloaded(object sender, RoutedEventArgs e)
  20.         {
  21.             TaskbarManager.Instance.SetProgressState(TaskbarProgressBarState.NoProgress);
  22.         }
  23.  
  24.         private void ProgressBar_Loaded(object sender, RoutedEventArgs e)
  25.         {
  26.             if (this.ProgressStateSelection.ItemsSource == null)
  27.             {
  28.                 this.ProgressStateSelection.ItemsSource = Enum.GetValues(typeof(TaskbarProgressBarState));
  29.                 ProgressStateSelection.SelectedItem = TaskbarProgressBarState.NoProgress;
  30.             }
  31.         }
  32.  
  33.         private void progressSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
  34.         {
  35.             UpdateProgress();
  36.         }
  37.  
  38.         //This method is part of the lab. If we are asked to show a progress bar,
  39.         //choose the appropriate TaskbarProgressState value and use the UpdateProgress
  40.         //method to perform the update.
  41.         private void ShowProgressBar_Click(object sender, RoutedEventArgs e)
  42.         {
  43.             if (ShowProgressBar.IsChecked.Value)
  44.             {
  45.                 ProgressStateSelection.SelectedItem = TaskbarProgressBarState.Normal;
  46.             }
  47.             else
  48.             {
  49.                 ProgressStateSelection.SelectedItem = TaskbarProgressBarState.NoProgress;
  50.             }
  51.             UpdateProgress();
  52.  
  53.         }
  54.  
  55.         //This method is part of the lab. When the progress bar state changes,
  56.         //synchronize it with the checkbox and use the UpdateProgress method to
  57.         //perform the update.
  58.         private void ProgressStateSelection_SelectionChanged(object sender, SelectionChangedEventArgs e)
  59.         {
  60.  
  61.             if ((TaskbarProgressBarState)ProgressStateSelection.SelectedItem == TaskbarProgressBarState.NoProgress)
  62.             {
  63.                 ShowProgressBar.IsChecked = false;
  64.             }
  65.             else
  66.             {
  67.                 ShowProgressBar.IsChecked = true;
  68.             }
  69.             UpdateProgress();
  70.  
  71.  
  72.         }
  73.  
  74.         //This method is part of the lab. When asked to update the progress state and
  75.         //we should indeed display a taskbar progress bar, use the TaskbarManager's
  76.         //SetProgressValue and SetProgressState methods to update the progress bar state.
  77.         private void UpdateProgress()
  78.         {
  79.  
  80.             if (ShowProgressBar.IsChecked.Value)
  81.             {
  82.                 TaskbarManager.Instance.SetProgressValue((int)progressSlider.Value, 100);
  83.                 TaskbarManager.Instance.SetProgressState((TaskbarProgressBarState)ProgressStateSelection.SelectedItem);
  84.             }
  85.             else
  86.             {
  87.                 TaskbarManager.Instance.SetProgressState(TaskbarProgressBarState.NoProgress);
  88.             }
  89.  
  90.  
  91.         }
  92.     }
  93. }

 
El control que hemos creado es el que se observa en la parte inferior de la imagen:
 
progressbar
 
A través de él podemos seleccionar los distintos estados:
en progreso, que se mostrará como una barra verde gradual
error, se mostrará una barra roja gradual
en pausa, se mostrará una barra amarilla gradual
pensando se mostrará una barra verde intermitente
 
De manera que veremos los estados de nuestra aplicación de la siguiente forma:
 
progbar1            progbar2           progbar3
En Progreso              Error                  Pensando
 
Desde mi punto de vista, este tipo de desarrollos son muy interesantes no sólo visualmente, sino también a nivel de usabilidad.