从不完整的Collection中填充ItemsControl

时间:2017-04-07 09:00:47

标签: c# wpf

我需要在WPF中创建一个PDF预览器,并希望在ItemsControl中显示绑定到ObservableCollection个已渲染页面的页面(每个页面都是BitmapSource个实例)。 ItemsControl也位于ScrollViewer内。现在,我不想一次渲染所有页面,因为可能有一百页,他们会非常快地吃掉内存。我想只渲染应用程序窗口中可见的那些。但是,与此同时,我希望ItemsControl与PDF文档中所有页面的数量一样大,以便ScrollViewer的滚动条足够小并显示多少更多的是滚动。

所以问题是,如何使ItemsControl与所有网页的数量一样大但不使ObservableCollection拥有所有网页?

我还考虑用ItemsControl替换Grid并添加一些虚设项目,Height设置为页面高度,然后将其替换为实际页面&# 39;用户可以看到,但这似乎很多工作。

1 个答案:

答案 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>