сделать скриншот сетки данных WPF с помощью scrollviewer

Я пытаюсь сделать снимок экрана с сеткой данных, в которой должно отображаться много строк. Итак, есть скроллвьювер. Поэтому, когда я просто помещаю сетку данных в метод рендеринга RenderTargetBitmap, я, очевидно, просто получаю видимую часть сетки данных. Я читал, что можно сделать снимок экрана содержимого при фактическом рендеринге ItemsPresenter ScrollViewer этого элемента управления, поскольку ItemsPresenter будет иметь «настоящую» ширину и высоту содержимого.

К сожалению, мой ScrollViewer не имеет другой высоты, ActualHeight или RenderSize.Height, чем dataGrid. Так что я всегда просто получаю видимую часть Контента.

Кто-нибудь знает, как это сделать правильно, чтобы на самом деле он занимал весь контент?

Код:

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

person david    schedule 02.03.2012    source источник
comment
Элемент управления DataGrid отображает только то, что видно, в качестве оптимизации, поэтому больше нечего видеть — вы можете убедиться в этом сами, используя что-то вроде Инспектор WPF для просмотра визуального дерева DataGrid. Вам нужно будет убедить DataGrid, что у него достаточно места, прежде чем использовать его в качестве визуального элемента.   -  person Leaf Garland    schedule 28.03.2012


Ответы (1)


Лист прав. Вы можете создать экземпляр другого DataGrid, привязанного к тому же источнику программно, поместить его в контейнер, который дает ему бесконечное пространство, дождаться его рендеринга, а затем сделать снимок экрана. Нет необходимости показывать это в пользовательском интерфейсе.

person Zak    schedule 18.05.2012
comment
Я сделал это, но тогда сетки в сетке данных отображаются странно. Некоторые из них уже не в очереди и меняются в каждом ряду. Так что я думаю, что то, что я пытался сделать, на самом деле невозможно... :( - person david; 12.06.2012
comment
ты видел это кстати? stackoverflow.com/questions/1877115/ - person Zak; 13.06.2012