Отображение хода выполнения длительного процесса в панели задач Windows 7 при помощи WPF 4.

Сегодня мы продолжим рассмотрение новых функций WPF 4, начатое здесь и здесь.

Те из нас, кто уже работает под Windows 7, заметили, что часть приложений, например, Internet Explorer, умеет отображать ход выполнения длительных процессов (например, в IE – загрузку файлов из Интернет) в иконке приложения на панели задач. До выхода .NET Framework 4 реализовать подобный функционал можно было лишь при помощи внешних библиотек или PInvoke. Однако, в WPF 4 данная функция реализована на уровне фреймворка и не требует использования кода третьих лиц.

Шаг 1. В XAML окна, предназначенного для отображения хода процесса, добавляем ссылку на TaskbarItemInfo (строки с 7 по 9):

 1: <Window x:Class="IconProgressDemo.MainWindow" 
 2:      xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation" 
 3:         xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml" 
 4:         Title="MainWindow" Height="130" Width="490"> 
 5:      
 6:     <!--Сслылка на TaskbarItemInfo: --> 
 7:     <Window.TaskbarItemInfo> 
 8:         <TaskbarItemInfo /> 
 9:     </Window.TaskbarItemInfo> 
 10:      
 11:     <Grid> 
 12:         <StackPanel> 
 13:             <!--Обычный WPF ScrollBar: --> 
 14:             <ProgressBar Name="progressBar" HorizontalAlignment="Stretch" Height="25" /> 
 15:              
 16:             <!-- Запускаем прогресс по нажатию на эту кнопку: --> 
 17:             <Button HorizontalAlignment="Center" Margin="0,20" Width="65" Height="25" Click="Button_Click"></Button> 
 18:         </StackPanel> 
 19:     </Grid> 
 20: </Window> 
 21: 
 22: 

Шаг 2. Переключаемся в код данного окна. В качестве имитации длительного процесса мы воспользуемся BackgroundWorker. Для отображения хода процесса, мы будем сообщать текущее значение одновременно как ProgressBar, так и TaskbarItemInfo (строки 40 и 41):

 1: private  void  Button_Click(object  sender, RoutedEventArgs  e)
 2: {
 3:     //Иммитируем длительный процесс при помощи BackgroundWorker:
 4:      using(BackgroundWorker  bw = new  BackgroundWorker ())
 5:     {
 6:         bw.WorkerReportsProgress = true ;
 7: 
 8:         //Передаем состояние процесса:
 9:          bw.ProgressChanged += new  ProgressChangedEventHandler (bw_ProgressChanged);
 10: 
 11:         //Обнуляем счетчик:
 12:          bw.RunWorkerCompleted += new  RunWorkerCompletedEventHandler (bw_RunWorkerCompleted);
 13: 
 14:         bw.DoWork += (p, ev) =>
 15:             {
 16:                 for  (int  i = 0; i <= 100; i += 10)
 17:                 {
 18:                     Thread .Sleep(1000);
 19:                     ((BackgroundWorker )p).ReportProgress(i);
 20:                 }
 21:             };
 22: 
 23:         //Задаем состояние индикатора прогресса:
 24:          TaskbarItemInfo.ProgressState = System.Windows.Shell.TaskbarItemProgressState .Normal;
 25: 
 26:         bw.RunWorkerAsync();
 27:     }
 28: }
 29: 
 30: void  bw_RunWorkerCompleted(object  sender, RunWorkerCompletedEventArgs  e)
 31: {
 32:     //Процесс закончен,обнуляем счетчик:
 33:      progressBar.Value = 0;
 34:     TaskbarItemInfo.ProgressValue = 0;
 35: }
 36: 
 37: void  bw_ProgressChanged(object  sender, ProgressChangedEventArgs  e)
 38: {
 39:     //Передаем значение процесса одновременно и в ProgressBar, и в TaskbarItemInfo:
 40:      progressBar.Value = e.ProgressPercentage;
 41:     TaskbarItemInfo.ProgressValue = (double )e.ProgressPercentage / 100;
 42: }
 43: 

Шаг 3. Прежде, чем запустить процесс, определимся какой тип отображения нам нужен (строка 24). TaskbarItemInfo.ProgressState поддерживает следующие значения: Normal, Error, Indeterminate, None и Paused. По умолчанию используется None, поэтому явное указание режима обязательно.

Шаг 4. Запускаем программу и нажимаем «Старт!». На иконке в панели задач у нас отображается ход процесса, синхронно с основным ProgressPar:

TaskbarItemInfo.ProgressState в режиме Normal

Это демо было запущено в режиме Normal. Давайте рассмотрим остальные режимы TaskbarItemInfo.ProgressState.

Режим Error, в точности, как и Normal, отображает состояние процесса, но красным цветом. Подойдет для формирования отчета об ошибке, либо при возникновении нештатной ситуации, о которой вы хотите сообщить пользователю, не прерывая основного процесса или подобной ситуации.

Режим Indeterminate подходит для процессов, длительность которых вы не можете заранее предсказать, только окончание. Этот режим отображает «бегущую волну» (или «пульс» – кому как нравится), давая понять, что процесс еще не закончен.

Режим Paused выводит статус процесса в желтом цвете. Как следует из его названия, он подойдет, когда процесс приостановлен. Однако имейте в виду, что изменение свойства TaskbarItemInfo.ProgressState на Paused само по себе процесс не приостанавливает.

Error Indeterminate Paused

Режимы отображения Error, Indeterminate и Paused.

Technorati Tags: .NET4,WPF4,VS2010Tip