WPF делает скриншот приложения, включая скрытый контент - PullRequest
0 голосов
/ 18 февраля 2019

Под категорией "ограничения технологии":

Я получил требование иметь кнопку скриншота в моем приложении, которая сделает скриншот и запустит диалоговое окно принтера.Справедливо.Мой код достигает этого.Я просто беру свое окно и использую RenderTargetBitmap для рендеринга окна.

Однако теперь в требовании говорится, что оно должно включать весь контент, который скрыт за полосами прокрутки.Это означает, что на скриншоте приложение должно выглядеть «растянутым», чтобы исключить полосы прокрутки и показать все данные.Например, если существует большой список или сетка данных, все данные должны быть видны.

Помня о том, что WPF может виртуализировать, а не отображать вещи, которые не отображаются, есть ли способ, которым я могу достичьэто требование?Есть ли возможность визуализировать визуальное дерево в отдельном бесконечном пространстве и сделать там скриншот?Что-то еще?

В ответ на комментарии:

Кнопка снимка экрана находится на внешней оболочке, которая содержит только меню.Внутри этой оболочки может быть размещено любое из 800+ представлений.Эти представления могут содержать сетки данных, списки, большие формы, состоящие из текстовых полей ... что угодно.Невозможно определить, что находится «внутри», не обходя визуальное дерево.

Запрошенная функциональность аналогична печати веб-страницы в браузере в формате PDF.Это также даст вам весь DOM вместо того, что вы видите в ограниченном представлении браузера.

1 Ответ

0 голосов
/ 18 февраля 2019

XAML:

<Grid>
    <Button
        x:Name="btnPrint"
        Width="50"
        HorizontalAlignment="Left"
        VerticalAlignment="Top"
        Click="BtnPrint_Click"
        Content="Print" />
    <ScrollViewer Height="500" HorizontalAlignment="Center">
        <Grid x:Name="toPrint">
           <!--your code goes here-->
        </Grid>
    </ScrollViewer>
</Grid>

C #:

private void BtnPrint_Click(object sender, RoutedEventArgs e)
    {
        var pdialog = new PrintDialog();
        if (pdialog.ShowDialog() == true)
        {

            System.Windows.Size pageSize = new System.Windows.Size { Height = pdialog.PrintableAreaHeight, Width = pdialog.PrintableAreaWidth };
            toPrint.Measure(pageSize);
            toPrint.UpdateLayout();
            pdialog.PrintVisual(toPrint, "Print");

        }
    }
...