2012-10-31 3 views
2

매우 크고 복잡한 개체 - 가상 배열을 2 차원 행렬로 인쇄해야합니다. 왼쪽과 위쪽에 두 개의 표가 있고 중간에 표의 교차점을 나타내는 점이 무엇입니까? 각 테이블은 5000 개가 넘는 레코드를 가질 수 있습니다. 그래서 나는이 모든 것을 통제했습니다. 꽤 잘 작동합니다. 그러나 고객이 인쇄하려고합니다. 하나의 페이지에 너무 큰 행렬이있을 때 나는 각 부분을 인쇄하여 각 부분을 인쇄해야합니다.wpf에서 매우 큰 개체를 인쇄하는 방법

매트릭스를 용지 크기로 나누고 각 파트에 대한 플로우 파일을 빌드 할 수 있습니다. 그러나 그것은 많은 문제가있는 냄새입니다. 특히 테이블에는 열의 사용자 정의 개수가 있으므로 모든 열을 한 문서에 배치 할 수 없습니다.

그래서이 방법을 구현하는 가장 쉬운 방법이 있기를 바랍니다. (엑셀에서 인쇄 제외)

답변

0

"쉬운"방법은 문서의 비트 맵을 만들고이 비트 맵에 문서의 모든 컨트롤을 RenderTargetBitmap으로 그려 비트 맵을 너비와 높이의 타일로 나눕니다. 페이지 직사각형의 각 타일을 선택하고 각 타일을 프린터에 그립니다.

하지 마십시오.

화면에서보기에는 좋지 않은 것이 종이에서보기에는 좋지 않습니다. 글꼴이 픽셀 화되고, 그라디언트가 디더링되고, 텍스트가 잘 리거나, 문서의 빈 영역이 텍스트가 미친 위치에 인쇄되게합니다. WPF 컨트롤은 UI 스레드에서만 사용할 수 있으며 UI 컨트롤을 많이 그리면 UI가 차단 될 수 있습니다.

대신; 프린터 기능을 활용하십시오. 세 개의 테이블이 있습니까? 각 표를 따로 인쇄하십시오. UI를 그리는 대신 각 셀 또는 그래픽에 대해 DrawingVisual을 만듭니다. 페이지의 각 셀을 배치하여 여백 밖에 있는지 확인합니다. 그럴 경우 수평 (오른쪽 여백을 벗어나는 경우) 또는 수직 (아래 여백을 벗어나는 경우)의 경사 목록에 추가하십시오. 첫 번째 페이지를 그린 후 모든 비주얼을 수평 슬롭에 그립니다. 수평 슬롭이 비워 질 때까지 그렇게 한 다음 수직 슬롭을 사용하여 다시하십시오. 다음 테이블을 위해 다시. DrawingVisual에는 백그라운드에서이 작업을 수행 할 수 있도록 UI 스레드가 필요하지 않습니다.

DocumentPaginator이이를 지원할 수 있습니다. 나는 그것을 시도하지 않았다. 행운을 빕니다.

+0

답변 해 주셔서 감사합니다. 나는 Visual 오브젝트를 렌더링 할 수 없다. 내 컨트롤은 모든 여유 공간을 탐지 한 다음 자신을 그립니다. 다른 데이터를 보려면 스크롤해야합니다. 왼쪽과 위의 표가 고정됩니다. 사용자가 아래로 스크롤하면 최상위 테이블은 그녀의 위치가 그대로 유지되며 동일한 동작이 테이블을 떠났습니다. 이 순간에 저는 제 컨트롤을 반복 가능한 템플릿으로 나눕니다. 결과로 나는 userControl의 2 차원 배열을 가진다. 지금은 인쇄 대화 상자없이이 모든 컨트롤을 인쇄해야합니다 ... 아니면 그냥 모든 부분을 인쇄하도록 보냅니다. – Crossman

+0

지금 내 방법은 꽤 빠릅니다. 아마도 DrawingVisual이 더 나을 것입니다. 나는 볼 것이다. 하지만 이제 인쇄를 끝내야합니다. 어떤 사람이 몇 가지 시각 요소를 인쇄하는 방법을 알고 있습니까? – Crossman

+0

"시각적 요소"란 무엇입니까? 'System.Windows.Media.Visual's? 그것은 추상적 인 클래스입니다. 코드를 게시하십시오. 사용자는 "다른 데이터를 보려면"종이에 인쇄 된 컨트롤을 스크롤 할 수 없음을 기억하십시오. –

관련 문제