Фиксированные документы характеризуются точной неизменной компоновкой и предназначены преимущественно для печати, но могут использоваться также и для чтения текста с экрана. К таким документам в WPF относятся документы на основе XPS. Для просмотра XPS-документа используется элемента DocumentViewer. В качестве содержимого DocumentViewer принимает элемент FixedDocument, который как раз и представляет фиксированный документ.
Например:
<Window x:Class="DocumentsApp.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:DocumentsApp" mc:Ignorable="d" Title="MainWindow" Height="250" Width="400"> <Window.Resources> <Style TargetType="Button"> <Setter Property="Height" Value="25" /> <Setter Property="Width" Value="80" /> <Setter Property="Margin" Value="25 5 25 5" /> </Style> </Window.Resources> <Grid> <Grid.RowDefinitions> <RowDefinition Height="*" /> <RowDefinition Height="Auto" /> </Grid.RowDefinitions> <DocumentViewer x:Name="documentViewer"> <FixedDocument> <PageContent> <FixedPage> <Grid Margin="10" Width="450" Height="600"> <TextBlock Text="Hello World!" /> <Ellipse Stroke="Green" Width="50" Height="50" Fill="Red" /> </Grid> </FixedPage> </PageContent> <PageContent Width="650" Height="900"> <FixedPage> <StackPanel Margin="10" Width="650" Height="900" Background="LightBlue"> <TextBlock Text="Page 2" /> </StackPanel> </FixedPage> </PageContent> </FixedDocument> </DocumentViewer> <StackPanel Orientation="Horizontal" Grid.Row="1" HorizontalAlignment="Center"> <Button Content="Сохранить" Click="Save_Click" /> <Button Content="Загрузить" Click="Load_Click" /> </StackPanel> </Grid> </Window>
Фиксированный документ FixedDocument может принимать различное количество страниц. Каждая страница представляет элемент PageContent. В этот элемент помещается объект FixedPage, в который в свою очередь помещаются другие элементы - это могут эллипсы, текстовые поля и т.д. Так, в данном случае у нас две страницы. Используя свойства Width и Height, мы можем управлять размером страниц.
Также, здесь мы разместили две кнопки для загрузки и сохранения документа. Теперь в файле кода c# определим для них обработчики событий:
using Microsoft.Win32; using System.IO; using System.Windows; using System.Windows.Xps.Packaging; using System.Windows.Xps; using System.Windows.Documents; namespace DocumentsApp { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void Save_Click(object sender, RoutedEventArgs e) { SaveFileDialog sfd = new SaveFileDialog(); sfd.Filter = "XPS Files (*.xps)|*.xps"; if (sfd.ShowDialog() == true) { XpsDocument doc = new XpsDocument(sfd.FileName, FileAccess.Write); XpsDocumentWriter writer = XpsDocument.CreateXpsDocumentWriter(doc); writer.Write(documentViewer.Document as FixedDocument); doc.Close(); } } private void Load_Click(object sender, RoutedEventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "XPS Files (*.xps)|*.xps"; if (ofd.ShowDialog() == true) { XpsDocument doc = new XpsDocument(ofd.FileName, FileAccess.Read); documentViewer.Document = doc.GetFixedDocumentSequence(); } } } }
Для сохранения и открытия документа применяется класс XpsDocument. Для его использования нам надо добавить в проект библиотеки ReachFramework.dll и System.Printing.dll.
Чтобы сохранить документ, получаем объект XpsDocumentWriter
и вызываем его метод Write()
.
Для открытия документа просто используем метод GetFixedDocumentSequence()
объекта XpsDocument.
И после запуска приложения мы сможем увидеть наш определенный в разметке xaml документ:
Как видно из скриншота, контейнер фиксированных документов DocumentViewer уже имеет некоторую базовую функциональность (например, масштабирование, поиск), которые мы можем использовать.
Для эксперимента можно также попробовать создать простейшие xps-файлы в MS Word (для этого стандартный документ docx можно экспортировать в формат xps) и загрузить этот документ в нашу программу.