Ленты (Ribbon)
37WPF --- Элементы управления WPF --- Ленты
На этом этапе может показаться, что возможности панелей инструментов в WPF являются недостаточными. Помимо двух встроенных средств — базовое дополнительное меню и возможность переупорядочения со стороны пользователя — никакими современными функциями они не обладают. Даже в наборе Windows Forms имеется средство, которое позволяет пользователям перетаскивать и пристыковывать панели инструментов в различных местах внутри окна.
Причина, по которой панели инструментов не были усовершенствованы после выхода первой версии WPF, очень проста: они являются "вымирающим видом". Хотя в настоящий момент они все еще продолжают пользоваться относительной популярностью, наблюдается переход на более интеллектуальные элементы управления с вкладками, такие как Ribbon (лента), который впервые появился в Office 2007, а теперь занимает почетное место в Windows 7 и Office 2010.
После создания элемента управления Ribbon у Microsoft возникла знакомая дилемма. Для улучшения продуктивности и согласованности всех Windows-приложений в Microsoft захотели каким-то образом стимулировать использование этого элемента управления. Но поскольку также хотели сохранить конкурентные преимущества, с выпуском API-интерфейсов, которые бы позволили это делать, торопиться не стали. В конечном итоге на исследование и усовершенствование версии Ribbon в Microsoft потратили тысячи часов, поэтому не удивительно, что результата пришлось дожидаться несколько лет.
К счастью, период ожидания закончился, и теперь Microsoft сделала версию Ribbon доступной и для разработчиков WPF. Хорошая новость состоит в том, что эта версия является совершенно бесплатной и обладает приличным объемом функциональности, в том числе разнообразными видами подсказок, раскрывающимися кнопками, элементами для запуска диалоговых окон, панелью быстрого доступа и настраиваемыми размерами.
В состав .NET Framework, однако, элемент управления Ribbon не входит. Он предлагается для загрузки в виде отдельного компонента. Его можно загрузить с веб-сайта лицензирования пользовательского интерфейса Office (Office UI Licensing, поищите ссылку "Лицензирование пользовательского интерфейса Office").
Пугаться терминологии не стоит: под лицензированием подразумевается просто предоставление своей контактной информации и принятие условий одностраничного соглашения, в котором требуется следовать рекомендациям по проектированию пользовательского интерфейса Office. (Другими словами, в Microsoft не хотят, чтобы элемент управления Ribbon использовался неподходящим образом).
После загрузки компонента Ribbon появится одна скомпилированная сборка типа библиотеки классов под названием RibbonControlsLibrary.dll. Чтобы приступить к использованию элемента управления Ribbon, понадобится просто добавить ссылку на эту сборку в любое приложение WPF.
Добавление элемента управления Ribbon
Как и для любого другого элемента управления, который не является частью ключевых библиотек WPF, сначала необходимо отобразить содержащую Ribbon сборку на префикс XML:
xmlns:r="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary"
После этого можно добавлять экземпляр элемента управления Ribbon в любое место окна:
<r:Ribbon>
</r:Ribbon>
Пока что наилучшим вариантом считается размещение элемента управления Ribbon в верхней части окна с использованием панели Grid или Dock. Но прежде чем двигаться дальше, в окно самого верхнего уровня следует внести одно изменение. Причина в том, что элемент управления Ribbon просто не выглядит правильно в обычном окне — он размещается под рамкой окна, из-за чего возникает впечатление, что он был добавлен в последний момент. Никакой линии границы между рамкой окна и элементом управления Ribbon не проходит, и панель быстрого запуска (тоже размещенная в верхней части окна), вставляется прямо в строку заголовка окна.
В библиотеке RibbonControlsLibrary.dll для решения этой проблемы предлагается класс RibbonWindow, который наследуется от класса Window и интегрируется с элементом управления Ribbon более гладким образом.
Ниже приведена базовая структура специального окна, унаследованного от RibbonWindow, в котором элемент управления Ribbon размещен в верхней части с сохранением второй строки Grid для отображения фактического содержимого окна:
<r:RibbonWindow x:Class="_29_Menu_and_ToolBar.Ribbon1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:r="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary"
Title="Ribbon1" Height="350" Width="525">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<r:Ribbon></r:Ribbon>
</Grid>
</r:RibbonWindow>
При использовании RibbonWindow удостоверьтесь, что класс отделенного кода, представляющий окно, не наследуется явно от класса Window. Если это так, замените его классом RibbonWindow или удалите эту часть объявления класса вообще, как показано ниже:
public partial class MainWindow
{ ... }
Такой подход сработает, т.к. в автоматически сгенерированной части класса MainWindow уже присутствует правильный производный класс RibbonWindow, потому что он был указан в XAML.
Во время применения RibbonWindow можно будет заметить одну особенность. Из-за отсутствия в окне строки заголовка (то, что похоже на строку заголовка, в действительности является частью элемента управления Ribbon), какой бы текст не устанавливался для свойства Window.Title, он будет игнорироваться. Для устранения этой проблемы необходимо просто установить тот же самый текст в свойстве Ribbon.Title.
Элемент управления Ribbon на самом деле состоит из трех фрагментов: панели для быстрого запуска (размещенной сверху), меню приложения (доступное через кнопку, отображаемую в самом конце слева, перед всеми вкладками) и самой ленты с множеством вкладок. В настоящее время никакого способа для отключения какого-то из этих компонентов не существует, поэтому элемент управления Ribbon должен использоваться только в полном виде.