2011-10-31 8 views
2

Silverlight UserControl의 스크린 샷을 인쇄해야합니다. 보통 PrintDocument로 일반적인 방법을 시도했지만 불행히도 너무 오래 걸리고 UI 스레드에서 발생해야하기 때문에 전체 응용 프로그램이 너무 오래 잠겨 있습니다. 컨트롤에 여러 페이지에 걸쳐 측정하고 인쇄해야하는 그리드가 포함되어 있기 때문에 시간이 오래 걸립니다.Silverlight - 백그라운드 스레드에서 컨트롤 렌더링

그래서 UI 스레드를 잠그지 않고이 작업을 수행 할 수있는 방법을 찾고 있습니다. 백그라운드 스레드에서 이러한 컨트롤을 다시 렌더링 할 수있는 방법이 있습니까 (원래 렌더링 된 컨트롤과는 별도로)? 그런 다음 PrintDocument로 보내거나 WritableBitmap을 사용하여 스크린 샷을 찍을 수없는 경우 계획을 세웁니다.

나는 이미 빠르지 만, 물론 나는 항상 스레드 유사성 문제를 가지고있다. 이 컨트롤을 사용자에게 표시하고 싶지는 않지만, 그 컨트롤을 얻는 방법이 있기를 바랍니까?

건배

+0

요소를 렌더링하려면 ** WriteableBitmap ** 클래스를 사용하셨습니까? http://msdn.microsoft.com/en-us/library/aa347331(v=VS.95).aspx – Aimeast

+0

Silverlight에서는 배경에서 컨트롤을 렌더링하는 것이 불가능 해 보입니다. 그렇게하려면 새로운 Dispatcher가 필요합니다. [MSDN] (http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher (v = vs.95) .aspx) Dispatcher는 UI 스레드에서만 사용할 수 있습니다. 인스턴스화 할 수도 없습니다. –

답변

0

당신은 WriteableBitmap

가 참조 할 루트 요소에 대한 참조를 가져옵니다 사용할 수 있습니다. 원할 경우 외부 소스에서 XAML을 동적으로로드하려면 XamlReader을 사용할 수 있습니다. 이 ScreenshotRoot

WriteableBitmap bmp = new WriteableBitmap(ScreenshotRoot.RenderSize.Width, ScreenshotRoot.RenderSize.Height)

bmp.Render(ScreenshotRoot, new MatrixTransform());

bmp.Invalidate();

당신은 다른 스레드에서이 작업을 수행 할 수 있어야합니다 호출합니다.

관련 문제