我需要在WPF中创建一个PDF预览器,并希望在ItemsControl
中显示绑定到ObservableCollection
个已渲染页面的页面(每个页面都是BitmapSource
个实例)。 ItemsControl
也位于ScrollViewer
内。现在,我不想一次渲染所有页面,因为可能有一百页,他们会非常快地吃掉内存。我想只渲染应用程序窗口中可见的那些。但是,与此同时,我希望ItemsControl
与PDF文档中所有页面的数量一样大,以便ScrollViewer
的滚动条足够小并显示多少更多的是滚动。
所以问题是,如何使ItemsControl
与所有网页的数量一样大但不使ObservableCollection
拥有所有网页?
我还考虑用ItemsControl
替换Grid
并添加一些虚设项目,Height
设置为页面高度,然后将其替换为实际页面&# 39;用户可以看到,但这似乎很多工作。
答案 0 :(得分:2)
您应该拥有ObservableCollection<BitmapSource>
,而不是拥有ObservableCollection<Page>
({1}},其中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>