Распечатать потоковое средство просмотра прокрутки документов на нескольких страницах

Я пытаюсь распечатать свой FlowDocument (который завернут в FlowDocumentScrollViewer), потому что у меня много текстов / текстовых полей / полей со списком, и высота страницы может стать большой!

Я использую это:

PrintDialog printDialog = new PrintDialog();
if (printDialog.ShowDialog() == true)
{
    Scrollvvv.Document.ColumnWidth = printDialog.PrintableAreaWidth;
    Scrollvvv.Document.ColumnGap = 0;
    printDialog.PrintDocument(((IDocumentPaginatorSource)Scrollvvv.Document).DocumentPaginator, ServicesLangue.RM.GetString("TITRE_MODIFIER_SALON_EXPOSANT"));
}

Мой xaml выглядит так:

<FlowDocumentScrollViewer Name="Scrollvvv" VerticalScrollBarVisibility="Auto">
    <FlowDocument Name="flowDoc" PagePadding="10">
        <Section>
            <BlockUIContainer>
                <Grid Name="grid_principale">
                    <!-- Lot of stuffs here -->
                </Grid>
            </BlockUIContainer>
        </Section>
    </FlowDocument>
</FlowDocumentScrollViewer>

Дело в том, что он печатает все мои данные на одной странице, с шириной в порядке (я могу добавить немного поля, но это нормально), но он сжимает все мои элементы управления, чтобы поместиться на одной странице по высоте.

Как это исправить? Я просто хотел бы отключить эту автоматическую высоту и сохранить исходный размер.


person user2088807    schedule 31.08.2013    source источник
comment
Какой размер страницы показывает DocumentPaginator?   -  person Nitin    schedule 31.08.2013
comment
PageCount: 0, IsPageCountValid: false, Page Size = {816, 1016} Спасибо   -  person user2088807    schedule 31.08.2013
comment
Я пробовал computePageCount, но ничего не изменилось, он считает 1 страницу вместо 0.   -  person user2088807    schedule 31.08.2013


Ответы (1)


Проблема в том, что вы помещаете все в один BlockUIContainer. DocumentPaginator не может разбить BlockUIContainer на страницы, то есть разбить его на несколько страниц. Если ваш пользовательский интерфейс статичен, вы можете использовать несколько контейнеров BlockUIContainer, чтобы обернуть свой пользовательский интерфейс. т.е.

    <BlockUIContainer>
      <Grid Name="grid_principale">
       <!-- Grid content here -->
      </Grid>
    </BlockUIContainer>
    <BlockUIContainer>
      <Grid Name="grid_principale2">
       <!-- Grid content here -->
      </Grid>
    </BlockUIContainer>

Это создаст несколько страниц. Также вам нужно будет установить FlowDocument.PageHeight перед печатью.

person Nitin    schedule 01.09.2013
comment
Спасибо, что выглядит намного лучше! Однако у меня есть несколько проблем: - Он печатает мои данные в 2 столбца - Контейнер blockUIContainer не может занимать более одной страницы? Он напечатал небольшую часть в правом столбце. Было бы лучше, если бы эта небольшая часть была на другой странице - после завершения печати мое приложение выдает мне исключение нулевого указателя в showdialog моего окна. Как мне этого избежать? Спасибо - person user2088807; 01.09.2013
comment
(Столбец исправлен, у меня только нулевое исключение. Может быть, мне следует скопировать свой FlowDocumentScrollViewer в новый объект? Но как я могу это сделать? - person user2088807; 01.09.2013
comment
рад, что это сработало для вас ... где вы получаете нулевое исключение ... можете поделиться кодом? - person Nitin; 01.09.2013
comment
Я удалил все строчки о растяжении документа и вроде работает, опубликую исключение, если это повторится снова. Спасибо ! - person user2088807; 02.09.2013