2012-03-02 2 views
3

많은 행을 표시해야하는 DataGrid의 스크린 샷을 만들려고합니다. 그래서 스크롤 뷰어가 있습니다. 그래서 DataGrid를 RenderTargetBitmap의 Render Method에 넣을 때 나는 분명히 DataGrid의 가시적 인 부분만을 얻습니다. ItemsPresenter에 내용의 "실제"너비와 높이가 있으므로 실제로 해당 컨트롤의 ScrollViewer의 ItemsPresenter를 렌더링 할 때 내용의 스크린 샷을 찍을 수 있습니다.scrollviewer를 사용하여 WPF DataGrid의 스크린 샷을 찍으십시오.

불행히도 내 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); 
     } 
+0

DataGrid 컨트롤은 보이는 내용 만 최적화로 렌더링하므로 더 이상 볼 것이 없습니다. [WPF Inspector] (http://wpfinspector.codeplex.com/)와 같은 것을 사용하여 직접 볼 수 있습니다. DataGrid의 시각적 트리를 봅니다. DataGrid에 시각적으로 사용하기 전에 공간이 충분한 지 확인해야합니다. –

답변

0

잎 권리입니다. 프로그래밍 방식으로 동일한 소스에 바인딩 된 다른 DataGrid를 인스턴스화하고 무한 공간을 제공하는 컨테이너에 넣은 다음 렌더러가 기다렸다가이 스크린 샷을 캡처 할 수 있습니다. 실제로 UI에 표시 할 필요가 없습니다.

+0

이 작업을 수행했지만 데이터 그리드의 그리드가 이상하게 렌더링됩니다. 그들 중 일부는 더 이상 줄을 서서 매 행마다 바뀌지 않습니다. 그래서 내가 할 수있는 일이 실제로 가능하지 않다고 생각합니다. : ( – david

+0

어쩌면 최소한의 예제 프로젝트를 게시 할 수 있습니까? 다소 유용합니다 ... – Zak

+0

이 btw를 보았습니까? http://stackoverflow.com/questions/ 1877115/create-wpf-element-offscreen-and-render-to-bitmap? rq = 1 – Zak