WPF Document API в Expression Blend

76

На первой вкладке рассматриваемого ранее примера проекта используются элементы управления, которые компонуются и настраиваются довольно просто. Даже если заполнить их специальным, составным содержимым, то это не намного усложнит их разработку в среде Expression Blend IDE. Но имеется целый ряд элементов управления, для разработки которых требуются намного более сложные и развитые редакторы, позволяющие раскрывать коллекции других объектов, присутствующие в подобных элементах управления.

Здесь нет никакой практической возможности рассматривать редакторы каждого элемента управления в отдельности, поэтому функциональные возможности прикладного интерфейса WPF Document API (в Silverlight не поддерживается) будут продемонстрированы на примере компоновки второй вкладки.

Для обращения с простыми фрагментами текста вполне пригодны такие элементы управления, доступные на платформе WPF, как, например, Label, TextBox, TextBlock и PasswordBox. Несмотря на всю их полезность, в некоторых приложениях WPF требуется применять сложные, тщательно отформатированные текстовые данные, аналогичные тем. которые можно обнаружить в документах формата Adobe PDF.

Подобные функциональные возможности предоставляет прикладной интерфейс WPF Document API, хотя он и предполагает применение формата XPS (XML Paper Specification) вместо формата файлов PDF.

Используя различные классы из пространства имен System.Windows.Documents прикладного интерфейса WPF Document API, можно создать и подготовить к печати полноценный документ. Для этой цели в прикладном интерфейсе WPF Document API поддерживается целый ряд типов данных, обозначающих фрагменты документа в формате XPS, в том числе классы List, Paragraph, Section, Table, LineBreak, Figure, Floater и Span.

Блочные и внутристрочные элементы

Формально говоря, элементы, вводимые в документ формата XPS, относятся к одной из двух обширных категорий. К первой категории принадлежат блочные элементы, в том числе классы List, Paragraph, BlockUIContainer, Section и Table. Классы этой категории служат для группирования остального содержимого, например, списка, состоящего из разбитых на абзацы данных; абзаца, состоящего из подпунктов с отформатированным по-разному текстом, и т.д.

Ко второй категории относятся внутристрочные элементы, вкладываемые в блочные элементы или блоковые компоненты. К числу наиболее распространенных внутристрочных элементов относятся классы Run, Span, LineBreak, Figure и Floater.

Нетрудно догадаться, что эти классы носят названия терминов, используемых при создании форматированных документов в профессиональных редакторах. Как и все остальные элементы управления на платформе WPF, эти классы могут быть настроены в разметке XAML или в исходном коде. Следовательно, в разметке можно объявить пустой элемент <Paragraph>, заполняемый во время выполнения (в рассматриваемом здесь примере будет показано, как это делается).

Диспетчеры компоновки документов формата XPS

Как ни странно, но поместить внутристрочные и блочные элементы непосредственно в контейнер панели, например, типа Grid, нельзя. Вместо этого приходится вкладывать их в элемент разметки <FlowDocument> или <FixedDocument>.

Элемент типа FlowDocument идеально подходит для тех случаев, когда требуется предоставить пользователю возможность изменять порядок вывода данных на экран компьютерного монитора, включая масштабирование и форматирование текста, разбиение длинных страниц на две колонки и т.д. А элемент типа FixedDocument лучше всего подходит для представления подготовленных к печати и уже неизменяемых данных документа по принципу WYSIWYG ("что видишь на экране, то и получишь при печати").

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

FlowDocumentReader

Отображает данные в элементе типа FlowDocument и обеспечивает поддержку масштабирования, поиска и компоновки содержимого в самых разных формах

FlowDocumentScrollViewer

Отображает данные в элементе типа FlowDocument, но сами данные представлены единым документом, просматриваемым с прокруткой. В этом диспетчере компоновки масштабирование поиск или альтернативные режимы компоновки не поддерживаются

RichTextBox

Отображает данные в элементе типа FlowDocument и обеспечивает поддержку их редактирования пользователем

FlowDocumentPageViewer

Отображает документ только постранично. Допускает масштабирование, но не поиск данных

Наиболее полный в функциональном отношении способ отображения содержимого элемента типа FlowDocument состоит в том, чтобы поместить его в диспетчер компоновки типа FlowDocumentReader. В этом случае пользователь получает возможность изменять компоновку документа, искать в нем отдельные слова и масштабировать данные предоставляемыми для этих целей средствами пользовательского интерфейса. Единственное ограничение данного диспетчера компоновки, а также FlowDocumentScrollViewer и FlowDocumentPageViewer заключается в том, что данные в этих контейнерах отображаются только для чтения. Если же требуется предоставить пользователю возможность вводить новую информацию в элемент типа FlowDocument, то его следует поместить в диспетчер компоновки типа RichTextBox.

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