Фиксированные документы

Последнее обновление: 29.02.2016

Фиксированные документы характеризуются точной неизменной компоновкой и предназначены преимущественно для печати, но могут использоваться также и для чтения текста с экрана. К таким документам в 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 документ:

FixedDocument в WPF

Как видно из скриншота, контейнер фиксированных документов DocumentViewer уже имеет некоторую базовую функциональность (например, масштабирование, поиск), которые мы можем использовать.

Для эксперимента можно также попробовать создать простейшие xps-файлы в MS Word (для этого стандартный документ docx можно экспортировать в формат xps) и загрузить этот документ в нашу программу.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850