2010-08-31 155 views
7

我們的應用程序在畫布上有許多對象;畫布包含在滾動查看器中。我們也有一個滑塊控件和一些按鈕,總是居中在窗口的頂部。
我試圖通過捕獲應用程序的位圖來打印應用程序,但沒有任何「裝飾」 - 滑塊,按鈕或滾動條。SL 4 - 強制重繪視覺樹

 _scrollViewer.HorizontalScrollBarVisibility = ScrollBarVisibility.Hidden; 
     _scrollViewer.VerticalScrollBarVisibility = ScrollBarVisibility.Hidden; 
     var s = xSlider; 
     s.Visibility = Visibility.Collapsed; 
     var b = xPlusButton; 
     b.Visibility = Visibility.Collapsed; 
     b = xMinusButton; 
     b.Visibility = Visibility.Collapsed; 

     b = xButton; 
     b.Visibility = Visibility.Collapsed; 

滑塊和按鈕被隱藏,如預期的那樣,但滾動條不是。
我懷疑應用程序需要重繪佈局以隱藏滾動條。有沒有辦法做到這一點?由於SL 4中的打印操作必須由UI手勢啓動,所以這變得更加複雜; (AFAIK)無法以編程方式啓動,因此此重繪必須發生在PrintDocument事件處理程序之一中。

感謝您的任何建議....

+0

您可以顯示您正在打印的Canvas的Xaml嗎? 「捕捉位圖」評論聽起來有點偏離,你能否說得通嗎? – AnthonyWJones 2010-08-31 19:58:38

+0

我無法真正顯示xaml,因爲所有對象都在運行時添加,並大量使用模板。我相信這是導致惡作劇的模板;將Canvas傳遞給PrintDocument之後,該樹永遠不會重繪(至少不會完全)。由於打印輸出是大量缺失或未完成繪製的對象,因此顯示出來。 我們試圖捕獲Canvas的位圖來解決未完成繪製的對象問題。 – Number8 2010-09-08 14:52:48

+0

你可以發佈你的捕獲位圖的代碼嗎? – 2011-06-30 06:43:56

回答

7

嘗試以下,

canvas.InvalidateMeasure(); 
canvas.InvalidateArrange(); 

您也可以使用WritableBitmap捕獲的運行時刻圖像和發送圖像打印的文檔,在情況打印文檔時忽略渲染變換。

另外,如果您使用WritableBitmap捕獲元素,則應該將RenderTransform作爲第二個參數。你可以發佈你的代碼來捕獲屏幕?

+0

請標記爲答案,如果它幫助你。 – 2011-07-26 05:07:46

+0

+1爲正確!這正是我需要強制LayouUpdated事件觸發。 – dFlat 2011-09-20 05:50:36

2

除了Akash建議的InvalidateMeasure和InvalidateArrange方法之外,您還可以嘗試使用UpdateLayout方法。

兩個無效方法將標記控件的度量或安排爲需要再次執行,但不一定立即執行。 UpdateLayout將強制它立即執行一些更新。

這是一個黑盒子,所以你可能需要無效然後調用UpdateLayout。有時你可能只需要調用UpdateLayout。