Глава 25
Элементы управления, компоновки, события и привязка данных в WPF
В главе 24 была представлена основа программной модели WPF, включая классы Window и Application, грамматику XAML и использование файлов кода. Кроме того, в ней было дано введение в процесс построения приложений WPF с применением визуальных конструкторов IDE-среды Visual Studio. В настоящей главе вы углубитесь в конструирование более сложных графических пользовательских интерфейсов с использованием нескольких новых элементов управления и диспетчеров компоновки, а также по ходу дела выясните дополнительные возможности визуального конструктора WPF в Visual Studio.
Здесь будут рассматриваться некоторые важные темы, связанные с элементами управления WPF, такие как программная модель привязки данных и применение команд управления. Вы узнаете, как работать с интерфейсами Ink API и Documents API, которые позволяют получать ввод от пера (или мыши) и создавать форматированные документы с использованием протокола XML Paper Specification.
Обзор основных элементов управления WPF
Если вы не являетесь новичком в области построения графических пользовательских интерфейсов, то общее назначение большинства элементов управления WPF не должно вызывать много вопросов. Независимо от того, какой набор инструментов для создания графических пользовательских интерфейсов вы применяли в прошлом (например, VB6, MFC, Java AWT/Swing, Windows Forms, GTK+/GTK# и т.п.), основные элементы управления WPF, перечисленные в табл. 25.1, вероятно покажутся знакомыми.
На заметку! Целью настоящей главы не является рассмотрение абсолютно всех членов каждого элемента управления WPF. Взамен вы получаете обзор разнообразных элементов управления с упором на лежащую в основе программную модель и ключевые службы, общие для большинства элементов управления WPF.
Элементы управления для работы с Ink API
В дополнение к общепринятым элементам управления WPF, упомянутым в табл. 25.1, инфраструктура WPF определяет элементы управления для работы с интерфейсом Ink API. Данный аспект разработки WPF полезен при построении приложений для Tablet PC, т.к. он позволяет захватывать ввод от пера. Тем не менее, это вовсе не означает, что стандартное настольное приложение не может задействовать Ink API, поскольку те же самые элементы управления могут работать с вводом от мыши.
Пространство имен System.Windows.Ink из сборки PresentationCore.dll содержит разнообразные поддерживающие типы Ink API (например, Stroke и StrokeCollection). Однако большинство элементов управления Ink API (вроде InkCanvas и InkPresenter) упакованы вместе с общими элементами управления WPF в пространстве имен System.Windows.Controls внутри сборки PresentationFramework.dll. Мы будем работать с интерфейсом Ink API позже в главе.
Элементы управления для работы с документами WPF
Вдобавок инфраструктура WPF предоставляет элементы управления для расширенной обработки документов, позволяя строить приложения, которые включают функциональность в стиле Adobe PDF. С применением типов из пространства имен System.Windows.Documents (также находящегося в сборке PresentationFramework.dll) можно создавать готовые к печати документы, которые поддерживают масштабирование, поиск, пользовательские аннотации ("клейкие" заметки) и другие развитые средства работы с текстом.
(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})
Тем не менее, "за кулисами" элементы управления документов не используют API-интерфейсы Adobe PDF, а взамен работают с API-интерфейсом XML Paper Specification (XPS). Конечные пользователи никакой разницы не заметят, потому что документы PDF и XPS имеют практически идентичный вид и поведение. В действительности доступно множество бесплатных утилит, которые позволяют выполнять преобразования между указанными двумя файловыми форматами на лету. Из-за ограничений по объему такие элементы управления в текущем издании не рассматриваются.
Общие диалоговые окна WPF
Инфраструктура WPF также предлагает несколько общих диалоговых окон, таких как OpenFileDialog и SaveFileDialog, которые определены в пространстве имен Microsoft.Win32 внутри сборки PresentationFramework.dll. Работа с любым из указанных диалоговых окон сводится к созданию объекта и вызову метода ShowDialog():
using Microsoft.Win32;
// Для краткости код не показан.
private void btnShowDlg_Click(object sender, RoutedEventArgs e)
{
<b> // Отобразить диалоговое окно сохранения файла.</b>
SaveFileDialog saveDlg = new SaveFileDialog();
saveDlg.ShowDialog();
}
Как и можно было ожидать, в этих классах поддерживаются разнообразные члены, которые позволяют устанавливать фильтры файлов и пути к каталогам, а также получать доступ к выбранным пользователем файлам. Некоторые диалоговые окна применяются в последующих примерах; кроме того, будет показано, как строить специальные диалоговые окна для получения пользовательского ввода.
Краткий обзор визуального конструктора WPF в Visual Studio
Большинство стандартных элементов управления WPF упаковано в пространство имен System.Windows.Controls внутри сборки PresentationFramework.dll. При построении приложения WPF в Visual Studio множество общих элементов управления находится в панели инструментов при условии, что активным окном является визуальный конструктор WPF.
Подобно другим инфраструктурам для построения пользовательских интерфейсов в Visual Studio такие элементы управления можно перетаскивать на поверхность визуального конструктора WPF и конфигурировать их в окне Properties (Свойства), как было показано в главе 24. Хотя Visual Studio сгенерирует приличный объем разметки XAML автоматически, нет ничего необычного в том, чтобы затем редактировать разметку вручную. Давайте рассмотрим основы.
Работа с элементами управления WPF в Visual Studio
Вы можете вспомнить из главы 24, что после помещения элемента управления WPF на поверхность визуального конструктора Visual Studio в окне Properties (или прямо в разметке XAML) необходимо установить свойство x:Name, т.к. это позволяет обращаться к объекту в связанном файле кода С#. Кроме того, на вкладке Events (События) окна Properties можно генерировать обработчики событий для выбранного элемента управления. Таким образом, с помощью Visual Studio можно было бы сгенерировать следующую разметку для простого элемента управления Button: