Настройка панели задач Windows 7 из WPF – за пределами наложения TaskbarItemInfo

На панели задач Windows 7 на растровый значок 48x48 может быть наложено точечное изображение 16x16. Это часто используется, чтобы показать что-то подобное числу или цветному квадрату, показывающее состояние приложения.

<Window.TaskbarItemInfo>
        <TaskbarItemInfo Overlay="{Binding Overlay}"/>
    </Window.TaskbarItemInfo>

Можно использовать XAML-ресурс, чтобы наложить что-то на букву teh, извлекая наложение из модели ViewModel, если оно сохранено как кисть DrawingBrush в app.XAML или словаре ресурсов.

public DrawingImage Overlay
 {
      get
       {
              var visual = App.Current.Resources["GreenVisual"] as DrawingBrush;
              return visual==null? null: new rawingImage(visual.Drawing);                   
       }
 }

Подобно следующему примеру из приложения MetroTwit:

Это замечательно, но в точечном рисунке 16x16 не слишком много места.

Мне хотелось бы динамически управлять всем значком 48x48, чтобы отобразить несколько "элементов" и окружающую круговую диаграмму, визуально символизирующую состояние "элементов", деля их на группы зеленого, желтого и красного цвета. Например так:

Для этого я решил вместо наложения привязать фактический значок окна Window к свойству в ViewModel.

Icon="{Binding Icon}"

ViewModel возвращает ImageSource, созданный в отдельном проекте пользовательского элемента управления WPF, содержащего элемент UserControl, отображаемый в RenderTargetBitmap. Это позволяет мне использовать XAML для создания визуального элемента и ссылаться на этот проект из проекта ViewModel, который необязательно является проектом WPF (если ViewModel находится в библиотеке классов).

public ImageSource Icon
  {
      get { return _imageGenerator.GetImageSource(Green, Yellow, Red); }
   }

Формирователь изображения imageGenerator создает в памяти экземпляр пользовательского элемента управления и изображает его на лету, используя класс PiePiece, производный от класса Shape, для рисования круговой диаграммы из 3 секторов.

Демонстрационный код выполняется без программной части за исключением подключения модели представления ViewModel к окну, а также показывает несколько других свойств значка, таких как ProgressState и ProgressValue наложения TaskBarItemInfo для получения хорошего эффекта "загружаемого файла" на панели задач.