使用滚动视图(ScrollViewer)截取WPF数据表格(DataGrid)的屏幕截图

3
我正在尝试截取一个数据网格的屏幕截图,但是它有太多行无法显示,因此需要使用滚动条。 当我将数据网格放入RenderTargetBitmap的Render方法中时,我只会得到可见部分的数据网格,这是显然的。 据我了解,可以在渲染控件的ScrollViewer的ItemsPresenter时,拍摄该内容的屏幕截图,因为ItemsPresenter将具有内容的“实际”宽度和高度。
不幸的是,我的ScrollViewer没有任何不同于dataGrid的Height、ActualHeight或RenderSize.Height。 因此,我总是只能获得内容的可见部分。
请问是否有正确的方法可以完整地截取整个内容?
代码:
        var scroll = GetTemplateChildByName(dataGridInOut);
        if (scroll != null)
        {
            var item = scroll.Content as ItemsPresenter;
            var width = item.RenderSize.Width;
            var height = item.RenderSize.Height;
            var rtb = new RenderTargetBitmap((int) Math.Round(width), (int)Math.Round(height), 96, 96,
                                             PixelFormats.Pbgra32);
            var drawingVisual = new DrawingVisual();
            var visualBrush = new VisualBrush(item);
            using (var context = drawingVisual.RenderOpen())
            {
                context.DrawRectangle(visualBrush, null, new Rect(new Point(0,0), new Size(width, height)));
            }
            rtb.Render(drawingVisual);
            Clipboard.SetImage(rtb);
        }

数据网格控件只渲染可见部分,作为一种优化方式,因此没有更多内容可见 - 您可以使用类似 WPF Inspector 的工具查看数据网格的可视树来验证这一点。 在将其用作可视化之前,您需要让数据网格相信它有足够的空间。 - Leaf Garland
1个回答

0

Leaf 是正确的。您可以通过编程方式实例化另一个绑定到相同源的 DataGrid,将其放入一个给予它无限空间的容器中,等待其渲染,然后对其进行屏幕截图。无需在 UI 中实际显示它。


我尝试过这样做,但是数据网格中的网格呈现出奇怪的效果。其中一些不再在同一行上,并且每一行都会发生变化。所以我猜我尝试做的事情实际上是不可能的... :( - david
你看到这个了吗?顺便提一下,https://dev59.com/b3I-5IYBdhLWcg3wZ3YR?rq=1 - Zak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接