Изменение значков и окон предварительного просмотра, отображаемых в панели задач

68

Панель задач в Windows 7 имеет еще несколько улучшений, в том числе отображаемыми по желанию индикаторами выполнения и миниатюрными окнами предварительного просмотра. К счастью, WPF позволяет легко работать со всеми этими функциональными возможностями.

Для получения доступа к любому из этих средств применяется класс TaskbarItemInfo, который находится в том же пространстве имен System.Windows.Shell, что и классы для работы со списками часто используемых элементов. Каждое окно обладает возможностью иметь один ассоциируемый объект TaskbarItemInfo, который можно создавать с помощью XAML за счет добавления в класс окна следующего кода разметки:

<Window x:Class="Windows7_TaskBar.ThumbnailButtons"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="ThumbnailButtons" Height="300" Width="300">
    <Grid>
    ...
    </Grid>
    <Window.TaskbarItemInfo>
        <TaskbarItemInfo x:Name="taskBarItem">
            ...
        </TaskbarItemInfo>
    </Window.TaskbarItemInfo>

Этот шаг сам по себе ничего не меняет ни в окне, ни в приложении, но позволяет далее использовать средства, описанные в последующих разделах.

Усечение миниатюр предпросмотра

Во многом подобно тому, как каждое приложение в Windows 7 автоматически снабжается поддержкой списков часто используемых элементов, оно также получает и миниатюрное окно предварительного просмотра, которое появляется при наведении пользователем курсора мыши на соответствующую кнопку в панели задач. Как обычно, в этом миниатюрном окне предварительного просмотра отображается уменьшенная версия клиентской области окна (т.е. все кроме границы окна). Но в некоторых случаях в нем может быть показана только часть содержимого окна.

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

Данное средство в WPF доступно с использованием свойства TaskbarItemInfo.ThumbnailClipMargin. Это свойство позволяет определять объект Thickness, который задает размер поля между содержимым, отображающимся в миниатюре, и краями окна.

Для создания такого эффекта в коде должно быть учтено несколько деталей — координаты кнопки, ее размеры и размеры области содержимого окна (которые совпадают с размерами самого высокоуровневого элемента Grid по имени LayoutRoot, размещенного внутри окна и содержащего весь код разметки). После получения этих чисел для ограничения миниатюры предварительного просмотра до нужной области потребуется лишь несколько простых вычислений.

Кнопки предпросмотра

Некоторые приложения используют окно предварительного просмотра для совершенно другой цели — для отображения различных кнопок в небольшой области вида панели инструментов под миниатюрой предпросмотра. Одним из примеров таких приложений является проигрыватель Windows Media. При наведении курсора мыши на его значок в панели инструментов появляется окно предпросмотра, которое включает в себя кнопки для воспроизведения, приостановки, прокручивания вперед и прокручивания назад. Это предоставляет удобный способ для управления процессом воспроизведения без перехода в само приложение.

Подобные кнопки называются кнопками предпросмотра (thumbnail buttons) и поддерживаются в WPF. Использовать их в WPF очень просто — нужно лишь добавить один или более объектов ThumbButtonInfo в коллекцию TaskbarItemInfo.ThumbButtonInfos. Каждый объект ThumbButtonInfo нуждается в изображении, которое предоставляется с помощью свойства ImageSource. Свойство Description позволяет указать текст, который будет отображаться в качестве всплывающей подсказки. Остается лишь подключить кнопку к соответствующему методу в приложении, обработав ее событие Click.

Ниже приведен пример добавления кнопок для запуска и останова воспроизведения в проигрывателе:

<Window.TaskbarItemInfo>
        <TaskbarItemInfo x:Name="taskBarItem">
            <TaskbarItemInfo.ThumbButtonInfos>
                <ThumbButtonInfo ImageSource="play.png" Description="Play"
                                 Click="cmdPlay_Click"></ThumbButtonInfo>
                <ThumbButtonInfo ImageSource="pause.png" Description="Pause"
                                 Click="cmdPause_Click"></ThumbButtonInfo>
            </TaskbarItemInfo.ThumbButtonInfos>
        </TaskbarItemInfo>
    </Window.TaskbarItemInfo>
Добавление кнопок в миниатюры предпросмотра

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

Имя Описание
ImageSource Позволяет указывать изображение для кнопки, которое должно быть встроено в приложение в виде ресурса. В идеале это должен быть файл .png, обладающий прозрачным фоном
Description Позволяет указывать текст, который должен отображаться в виде подсказки при наведении пользователем на данную кнопку курсора мыши
Command, CommandParameter и CommandTarget Позволяют указывать команду, к запуску которой должен приводить щелчок на кнопке. Могут применяться вместо события Click
Visibility Позволяет скрывать и показывать кнопку
IsEnabled Позволяет деактивизировать кнопку, т.е. делать так, чтобы она оставалась видимой, но выполнять на ней щелчок было нельзя
IsInteractive Позволяет деактивизировать кнопку без затемнения ее внешнего вида. Это может быть удобно, если нужно, чтобы кнопка выступала в качестве разновидности индикатора состояния
IsBackgroundVisible Позволяет отключать реакцию на наведение курсора мыши на кнопку. Если установлено в true (по умолчанию), Windows всегда подсвечивает кнопку и отображает вокруг нее границу при наведении на кнопку курсора мыши. Если установлено в false, ничего подобного не делается
DismissWhenClicked Позволяет создавать кнопку одноразового использования. Сразу же после выполнения щелчка на такой кнопке Windows удаляет ее из панели задач. (Для достижения большего контроля можно использовать специальный код для добавления или удаления кнопок на лету, но обычно гораздо проще отображать или скрывать их с помощью свойства Visibility.)

Индикаторы выполнения

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

Однако не всем может быть известно, что данная функция доступна не только в проводнике Windows. На самом деле она встроена в Windows 7 и доступна для использования во всех разрабатываемых приложениях WPF. Для работы с ней необходимо использовать два таких свойства класса TaskbarItemlnfo — ProgressValue и ProgressState.

Первоначально свойство ProgressState установлено в None, при этом индикатор выполнения не отображается. Указав для него значение TaskbarItemProgressState.Normal, можно получить окрашиваемый в зеленый цвет фон прогресса, аналогичный тому, что применяется в проводнике Windows. Свойство ProgressValue определяет его размер, от 0 (при котором он совершенно не заполнен) до 1 (при котором он полностью заполнен, т.е. свидетельствует о завершении выполнения операции). Например, если указать для свойства ProgressValue значение 0.5, то зеленым цветом будет заполнена ровно половина фона кнопки в панели задач.

Помимо None и Normal, перечисление TaskbarItemProgressState содержит еще несколько значений: Pause, позволяющее отображать желтый фон вместо зеленого; Error, предназначенное для отображения красного фона; Indeterminate, которое можно использовать для отображения постоянно пульсирующего фона индикатора выполнения с игнорированием значения свойства ProgressValue. Последний вариант подходит для ситуаций, когда неизвестно, сколько времени потребуется для завершения выполнения текущей операции (например, при обращении к веб-службе).

Пройди тесты
Лучший чат для C# программистов