3

我正在尝试截取必须显示多行的数据网格的屏幕截图。所以有一个滚动查看器。因此,当我只是将数据网格放入 RenderTargetBitmap 的渲染方法中时,我显然只是获得了数据网格的可查看部分。我读到可以在实际呈现该控件的 ScrollViewer 的 ItemsPresenter 时截取内容的屏幕截图,因为 ItemsPresenter 将具有内容的“真实”宽度和高度。

不幸的是,我的 ScrollViewer 与 dataGrid 没有任何不同的高度、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);
        }
4

1 回答 1

0

叶是对的。您可以以编程方式实例化另一个绑定到同一源的 DataGrid,将其放入一个为其提供无限空间的容器中,等待它呈现,然后对其进行截图。无需在 UI 中实际显示它。

于 2012-05-18T13:49:54.030 回答