C# 从不完整的集合填充ItemsControl

C# 从不完整的集合填充ItemsControl,c#,wpf,C#,Wpf,我需要在WPF中创建一个PDF预览器,并希望在绑定到呈现页面的observeCollection的ItemsControl中显示页面(每个页面都是BitmapSource实例)。ItemsControl也位于ScrollViewer中。现在,我不想一次呈现所有页面,因为可能有一百个页面,它们会很快消耗掉内存。我只想渲染那些在应用程序窗口中可见的。但是,同时我希望ItemsControl与PDF文档中所有页面的数量一样大,以便ScrollViewer的滚动条足够小,并显示还有多少页面需要滚动 所以

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

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


我还考虑将
项控件
替换为
网格
,并添加一些将
高度设置为页面高度的虚拟项,然后在用户可见时将其替换为实际页面,但这似乎需要大量工作。

而不是使用
可观察集合
(您似乎有)您应该有一个
ObservableCollection
,其中
页面
是一个具有BitmapSource属性的类,该属性实现了
INotifyPropertyChanged
接口,例如

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)));
        }
    }
}
现在,您可以创建尽可能多的
页面
实例,就像文档中的页面一样,并将它们放入ObservableCollection。只有当页面实际加载时,您才可以分配其
图像
属性,这将触发ItemTemplate中的如下绑定:

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

您应该拥有一个
可观察集合,而不是一个
可观察集合
,其中
页面
是一个具有BitmapSource属性的类,该属性实现了
INotifyPropertyChanged
接口,例如

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)));
        }
    }
}
现在,您可以创建尽可能多的
页面
实例,就像文档中的页面一样,并将它们放入ObservableCollection。只有当页面实际加载时,您才可以分配其
图像
属性,这将触发ItemTemplate中的如下绑定:

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


我是否可以在Page类中创建宽度和高度,以确保ItemsControl为每个页面保留足够的屏幕空间(以便ScrollViewer的滚动条具有适当的大小)?您可能会设置图像控件的固定大小。否则,您当然可以将其宽度和高度绑定到页面类的相应属性。因此类似于
?当然可以,为什么不试试呢?我是否可以在页面类中创建宽度和高度,以确保ItemsControl为每个页面保留足够的屏幕空间(以便ScrollViewer的滚动条具有适当的大小)?您可能会设置图像控件的固定大小。否则,您当然可以将其宽度和高度绑定到页面类的适当属性。因此类似于
?当然,为什么不试试呢?