2017-05-30 152 views
0

我需要編寫自己的pdf查看器(UserControl)。我使用pdfium.dll。它的包裝是PdfiumService。該服務可以將頁面呈現給BitmapSource。 PdfViewer在ScrollViewer的VirtualizingStackPanel中顯示頁面。 任何想法如何做懶惰渲染爲PDF?問題是,如果pdf大約是20mb(1000頁),則渲染的頁面需要大約2GB的RAM。使用wpf渲染pdf

Virtual VirtualStackPanel可以幫我嗎?我沒有發現任何「BeginVirtualizing」或其他事件。任何簡單的方法來知道什麼項目正在顯示?

也許這樣的事情:

  1. 計算有多少頁面可以一次顯示。
  2. 請參閱ScrollViewer的偏移量。
  3. 計算頁面索引現在正在顯示。
  4. 呈現當前旁邊的5個頁面。

是否有任何現成的解決方案或一些提示或想法?

+0

可以使用ItemConrol一個的ScrollViewer內,然後使用ScrollViewer中垂直偏移,您可以創建虛擬化的哪個頁面。 –

+0

是的,當然。問題不在於它。我使用ScrollViewer和ItemsControl,ItemsControl.ItemsPanel是VirtualizingStackPanel。我知道如何將數據綁定到容器。有沒有辦法做我想要的?或者只用手計算偏移量和圖像大小? – DdarkSideE

+0

我認爲沒有任何簡單的方法,因爲你必須也只加載那個在視圖中的頁面,所以你可以根據這個來計算 –

回答

0

好吧,我有一點與書籍的圖像....麻煩並不是真正的貴的地方,你把位圖,但你如何從圖書館獲取圖像...是一個接一個,依次或隨機?實際上,如果你使用VirtualizingStackPanel,它只會管理gui元素來創建或銷燬,但是如果你在內存中有一個完整的位圖集合,你已經死了。

一種方法是創建Page對象whitout位圖,並創建圖像所需要+添加一個計時器,將清除所有的「最古老的圖像」時

我做這樣的事情在CBR;我用一個custom控件來顯示

private BitmapImage _Image = null; 
    /// <summary> 
    /// the image 
    /// </summary> 
    public BitmapImage Image 
    { 
     get 
     { 
      if (_Image == null) 
       _Image = (DocumentFactory.Instance.GetService(Parent) as BookService).GetImageFromStream(Parent.FilePath, FilePath); 

      ImageLastAcces = DateTime.Now; 
      return _Image; 
     } 
     set { _Image = value; } 
    } 
+0

請注意,您也可以嵌入到您的應用程序中的一個winform查看器https://github.com/pvginkel/PdfiumViewer – GCamel

+0

我認爲,我按順序渲染pdf頁面。關於VirtualizingStackPanel我瞭解存儲在內存中的位圖。這是一個問題。我已經編寫了代碼來根據頁面大小,控件大小和ScrollViewer的偏移量僅渲染顯示的頁面。那麼,關於清除所有最古老的iamges。什麼是更好的?根據時間或滾動偏移量進行清理? – DdarkSideE

+0

我會說,也許在索引上,因爲在scrollviewer,如果我使用箭頭或下頁鍵,我可以在很短的時間quiclly填滿內存和時間清理將無法正常工作。順便說一下,您給了我一個很好的解決方案(pdfium),以開始在CBR中包含PDF查看,謝謝。 – GCamel