2017-04-07 32 views
0

我需要在WPF中創建一個PDF預覽器,並且想要在ItemsControl中顯示頁面,這些頁面綁定到ObservableCollection的渲染頁面(每個頁面是BitmapSource實例)。 ItemsControl也在ScrollViewer之內。現在,我不想一次渲染所有頁面,因爲可能會有一百個頁面,他們會非常快速地消耗內存。我只想呈現應用程序窗口中可見的那些。但是,與此同時,我希望ItemsControl與PDF文檔中所有頁面的數量一樣大,以便ScrollViewer的滾動條足夠小,並顯示需要滾動的內容。從一個不完整的集合填充ItemsControl

所以問題是,如何使ItemsControl與所有頁面的數量一樣大,但沒有使ObservableCollection擁有所有頁面?

我也算一個Grid替換ItemsControl並與Height設置頁面的高度增加一些虛擬物品,然後與實際的頁面替換它時,它的用戶可見,但是這似乎是很多工作。

回答

2

相反具有ObservableCollection<BitmapSource>(你看似有)你應該有一個ObservableCollection<Page>,其中Page是一類具有一個實現INotifyPropertyChanged接口的BitmapSource屬性,例如的

public class Page : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private BitmapSource image; 

    public BitmapSource Image 
    { 
     get { return image; } 
     set 
     { 
      image = value; 
      PropertyChanged?.Invoke(this, 
       new PropertyChangedEventArgs(nameof(Image))); 
     } 
    } 
} 

因爲有您的文檔中的頁面,您現在可以創建許多Page實例,並把它們放進的ObservableCollection。只有當實際加載的頁面,你會轉讓其Image屬性,這將觸發綁定像這樣在ItemTemplate:

<ItemsSource.ItemTemplate> 
    <DataTemplate> 
     <Image Source="{Binding Image}"/> 
    <DataTemplate> 
</ItemsSource.ItemTemplate> 
+0

我可以創建寬度和高度Page類,以確保ItemsControl中保留足夠的屏幕每個頁面的空間(以便ScrollViewer的滾動條具有適當的大小)? – Val

+0

您可能會設置一個固定大小的圖像控件。否則,你當然可以將其寬度和高度綁定到Page類的適當屬性。 – Clemens

+0

so like like ''? – Val