WPF拍摄包含隐藏内容的应用程序屏幕截图

时间:2019-02-18 12:53:40

标签: wpf screenshot

在“技术限制”类别下:

我已收到要求在我的应用程序中具有一个屏幕截图按钮的要求,该按钮将获取屏幕截图并启动打印机对话框。很公平。我的代码实现了这一点。我只是拿起窗口,然后使用RenderTargetBitmap渲染窗口。

但是,需求现在表明它应该包括所有隐藏在滚动条后面的内容。意思是,屏幕快照中的应用程序应看起来“已拉伸”,以便消除滚动条并显示所有数据。例如,如果列表或数据网格很大,则所有数据都应该可见。

请记住,WPF可能是虚拟化的,而不是渲染看不见的东西,请问有什么方法可以实现此要求?是否有可能将可视树渲染到单独的无限空间并在其中进行屏幕截图?还有吗?

回复评论:

屏幕截图按钮位于仅容纳菜单的外壳上。在此外壳内,可以托管800多个视图。这些视图可以包含数据网格,列表,由文本框组成的大型表格……任何内容。如果不走视觉树,就无法说出“内部”是什么。

所需功能类似于在浏览器中将网页打印为PDF。它还将为您提供整个DOM,而不仅仅是您在浏览器的受限视图中看到的内容。

1 个答案:

答案 0 :(得分:1)

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");

        }
    }