2012-03-02 2 views
3

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

К сожалению, мой ScrollViewer не имеет разной высоты, фактического веса или 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); 
     } 
+0

Элемент управления DataGrid отображает только то, что видно, как оптимизация, поэтому больше ничего не видно - вы можете увидеть это для себя, используя что-то вроде [WPF Inspector] (http://wpfinspector.codeplex.com/) для просмотрите визуальное дерево DataGrid. Вам нужно будет убедить DataGrid, что у него достаточно места, прежде чем использовать его как визуальный. –

ответ

0

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

+0

Я сделал это, но тогда сетки в datagrid выглядят странно. Некоторые из них больше не находятся в очереди и меняются в каждой строке. Так что я думаю, что это не совсем возможно, что я пытался сделать ... :( – david

+0

Возможно, вы могли бы опубликовать проект с минимальным примером? Звучит довольно полезно ... – Zak

+0

Вы видели этот кстати? Http://stackoverflow.com/questions/ 1877115/создать-Wpf-элемент-Offscreen-и-рендеринга к битовой карте? RQ = 1 – Zak

Смежные вопросы