【问题标题】:take a screenshot of WPF datagrid with scrollviewer使用 scrollviewer 截取 WPF 数据网格的屏幕截图
【发布时间】:2012-03-02 08:37:23
【问题描述】:

我正在尝试截取必须显示多行的数据网格的屏幕截图。所以有一个滚动查看器。 因此,当我只是将数据网格放入 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);
        }

【问题讨论】:

  • DataGrid 控件仅呈现可见的内容,作为一种优化,因此没有什么可看的了——您可以使用WPF Inspector 之类的东西自己查看,以查看 DataGrid 的可视化树。在将 DataGrid 用作视觉对象之前,您需要让 DataGrid 相信它有足够的空间。

标签: wpf datagrid screenshot rendertargetbitmap


【解决方案1】:

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

【讨论】:

  • 我这样做了,但随后数据网格中的网格变得很奇怪。其中一些不再排队,并且在每一行都发生变化。所以我想我试图做的事情不太可能...... :(
  • 你看到这个顺便说一句了吗? stackoverflow.com/questions/1877115/…
猜你喜欢
  • 1970-01-01
  • 2014-08-19
  • 1970-01-01
  • 1970-01-01
  • 2010-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多