WPF Printing - многостраничный счет через Flowdocument, Paginator и FixedDocument - PullRequest
1 голос
/ 14 октября 2010

В настоящее время мы используем WPF для создания многостраничного документа по накладной, который затем распечатывается / экспортируется через XPS.

Путь, который мы выбрали для достижения этой цели, - создать UserControl, содержащий стандартный ListBox и т. Д., Отображающий строки счета-фактуры, который затем включается в FlowDocument внутри тегов BlockUIContainer.

Когда этот FlowDocument помещается в теги FlowDocumentScrollViewer в окне, он работает отлично, при этом содержимое базы данных UserControl отображается правильно. Однако, когда мы пытаемся создать тот же FlowDocument в коде, он завершается с ошибкой "Не удается создать неизвестный тип" {clr-namespace: FOO} FooUserControl "XamlParseException. FlowDocument может быть успешно создан программно, если пользовательский элемент управления удален.

Это FlowDocument XAML:

<FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:local="clr-namespace:MARS"
          ColumnWidth="400" FontSize="14" FontFamily="Georgia">
<Paragraph>
    Blah
</Paragraph>

<BlockUIContainer>
    <local:printTestUserControl></local:printTestUserControl>
</BlockUIContainer>

И этот код мы используем для его создания в коде:

FileStream xamlFile = new FileStream("printTestFlowDoc.xaml", FileMode.Open, FileAccess.Read);            
FlowDocument content = (FlowDocument)XamlReader.Load(xamlFile);
flowDocScrollViewer.Document = content;
xamlFile.Close();

Причина, по которой мы создаем FlowDocument в коде, заключается в том, чтобы затем использовать объект Paginator, чтобы разделить его на серию FixedDocuments, чтобы затем распечатать / экспортировать в XPS, ни один из которых мы еще не пробовали, но из того, что я ' Вы читали до сих пор, кажется, что это реальный способ достижения многостраничной печати документов в WPF (где документ будет иметь верхний колонтитул на первой странице, итоговый нижний колонтитул на последней и x страниц строк между ними).

Любой совет по этому вопросу, или другие способы сделать это будет очень приветствоваться.

Это некоторые ссылки, по которым мы до сих пор собирали информацию, к сожалению, этого недостаточно! (я включу другие ссылки в комментарии, так как StackOverflow не доверяет мне более одной ссылки в настоящее время!)

См. Раздел «Динамическое создание документа FlowDinding, привязка данных и его печать». Скотт Хансельманн, похоже, столкнулся с той же проблемой, что и мы, но добавил строку

Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.SystemIdle, new DispatcherOperationCallback(delegate { return null; }), null);

не удалось загрузить наш FlowDocument, однако он связывал только TextBlocks в своем FlowDocument, а не включал UserControl.

Большое спасибо за чтение этого места! и за любую помощь может предложить любой.

1 Ответ

0 голосов
/ 05 января 2011

Извините, я так медленно приводил этот вопрос в порядок, но мы только что закончили этот проект, и сейчас я убираю все свободные концы от него.

Оказалось, что метод flowdocument / XPS был совершенно неверным способом решения этой задачи, и на самом деле встроенные отчеты RDLC позволили нам достичь всего, что нам нужно для документов счетов, относительно простым способом.

Основным преимуществом этого было то, что мы могли сообщать об экземплярах объектов нашей бизнес-модели в оперативной памяти, вместо того, чтобы использовать данные, отыскиваемые из БД, через хранимые процедуры, вызываемые из Crystal, на которые опиралась предыдущая система. на. Редактор файлов отчетов в VS был прост, чтобы справиться с ним, хотя порой немного раздражал, когда выкладывал сложные отчеты.

Надеюсь, это может пригодиться людям, которые рассматривают свои варианты, когда дело доходит до отчетов из приложений WPF.

...