Печать содержимого ScrollViewer - PullRequest
5 голосов
/ 02 января 2012

У меня есть следующее: Окно wpf с прокруткой и кнопкой «Печать».

Я пытаюсь распечатать содержимое прокрутки с помощью PrintDialog, но это работает только для xps. Если я выберу свой принтер или пишущий документ, то конечный результат будет ужасным (половина поля страницы, сокращение элементов управления и т. Д.). Как я могу решить эту проблему без изменения размера / масштабирования содержимого scrollviewer?

Ответы [ 2 ]

4 голосов
/ 02 января 2012

Для приличной (и относительно простой) печати в WPF вы должны использовать FlowDocumentScrollViewer вместо ScrollViewer. Внутри FlowDocumentScrollViewer вы можете поместить FlowDocument, который будет содержать содержимое, которое вы хотите распечатать.

Образец XAML:

<FlowDocumentScrollViewer>
    <FlowDocument PagePadding="48">
        <Section>
            <Paragraph>
                <Run Text="sample"/>
            </Paragraph>
        </Section>
        <Section>
            <BlockUIContainer>
                <my:myUserControl/>
            </BlockUIContainer>
        </Section>
    </FlowDocument>
</FlowDocumentScrollViewer>

Объект BlockUIContainer отлично подходит для хранения пользовательского контроля, который может содержать все, что вам нужно. Свойство PagePadding FlowDocument устанавливает поле. 48 эквивалентно 1/2 дюйма. (96 точек на дюйм).

Пример кода печати:

Dim pd As New PrintDialog
If pd.ShowDialog Then

    Dim fd As FlowDocument = docOutput

    Dim pg As DocumentPaginator = CType(fd, IDocumentPaginatorSource).DocumentPaginator

    pd.PrintDocument(pg, "my document")

End If
1 голос
/ 10 сентября 2015

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

Первым делом я установил содержимое в ScrollViewer, в моем случае сетку, на размер A4, что можно легко сделать с помощью

<Grid x:Name="gridReport" Height="29.7cm" Width="21cm">

Это означает, что сетка отображается точно в области печати, все, что находится внутри сетки, не должно быть искажено при печати. ​​

Это все равно отрубит верхнюю область, если ScrollViewer не был прокручен до вершины в точке использования PrintDialog. Чтобы решить эту проблему программно, перед печатью нажмите

Myscrollviewer.ScrollToTop();

PrintDialog printDialog = new PrintDialog();
if(printDialog.ShowDialog() == true)
{
    printDialog.PrintVisual(gridReport, "Print Report");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...