Wpf ItemsControl渲染缓慢

Wpf ItemsControl渲染缓慢,wpf,c#-4.0,wpf-controls,itemscontrol,Wpf,C# 4.0,Wpf Controls,Itemscontrol,我使用ItemsControl来显示项目列表,itrs xaml如下 <ItemsControl ItemsSource="{Binding ShelfItemsCollection}" Name="shelfGridView" Margin="5" > <ItemsControl.ItemTemplate> <DataTemplate> <Stackpanel>

我使用ItemsControl来显示项目列表,itrs xaml如下

<ItemsControl  ItemsSource="{Binding ShelfItemsCollection}" Name="shelfGridView" Margin="5" >
<ItemsControl.ItemTemplate>
        <DataTemplate>   
        <Stackpanel>                        
        <Image Width="150" Height="200" Stretch="Fill" Source="{Binding CoverImage}" ></Image> 
        +
        some other infos
        </Stackpanel>
        </DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>                    
            <WrapPanel  Orientation="Horizontal" />                    
    </ItemsPanelTemplate>
</ItemsControl.ItemsPanel>

有什么方法可以提高性能,或者有什么特定的原因导致渲染速度慢?

ItemsControl不支持开箱即用的UI虚拟化。使用ListBox或使ItemsControl UI虚拟化

您可以通过以下步骤在ItemsControl上启用UI虚拟化:

  • 在ItemsControl上设置虚拟化StackPanel.isVirtualization=“True”
  • ItemsPanel
    设置为
    virtualzingstackpanel
  • 覆盖项控件的
    ControlTemplate
    ,并将
    ItemsPresenter
    包装在
    ScrollViewer
    内部
  • 在ItemsControl上设置ScrollViewer.CanContentScroll=“True”
  • 有关上述建议的详细信息,请参见


    此外,您正在将
    ItemsSource
    直接设置为SourceCollection,即
    ShelfItemsCollection
    ,然后通过在该集合下方创建defaultview对其进行过滤。直接与sourceCollection绑定将强制
    ItemsControl
    (当然是非虚拟化的)生成100个容器来承载底层对象

    相反,您应该创建带有过滤器谓词的
    ICollectionView
    ,并将
    ItemsSource
    绑定到该实例。您还可以创建
    CollectionViewSource
    并与之绑定。如果您绑定过滤实例,它将只生成20个容器(非虚拟化ItemsControl)。
    当然,在ItemsControl上启用UI虚拟化将只为GUI上可见的UI项生成容器。ItemsControl不支持开箱即用的UI虚拟化。使用ListBox或使ItemsControl UI虚拟化

    您可以通过以下步骤在ItemsControl上启用UI虚拟化:

  • 在ItemsControl上设置虚拟化StackPanel.isVirtualization=“True”
  • ItemsPanel
    设置为
    virtualzingstackpanel
  • 覆盖项控件的
    ControlTemplate
    ,并将
    ItemsPresenter
    包装在
    ScrollViewer
    内部
  • 在ItemsControl上设置ScrollViewer.CanContentScroll=“True”
  • 有关上述建议的详细信息,请参见


    此外,您正在将
    ItemsSource
    直接设置为SourceCollection,即
    ShelfItemsCollection
    ,然后通过在该集合下方创建defaultview对其进行过滤。直接与sourceCollection绑定将强制
    ItemsControl
    (当然是非虚拟化的)生成100个容器来承载底层对象

    相反,您应该创建带有过滤器谓词的
    ICollectionView
    ,并将
    ItemsSource
    绑定到该实例。您还可以创建
    CollectionViewSource
    并与之绑定。如果您绑定过滤实例,它将只生成20个容器(非虚拟化ItemsControl)。
    当然,在ItemsControl上启用UI虚拟化将只为GUI上可见的UI项生成容器。

    是否使用筛选器将项限制为20?根据某些属性限制项,您可以根据属性值查看CloudFilter(),例如,如果property.Contains(“Japan”),然后它只显示与日本相关的记录,计数不必是20。我编辑了这个问题,并发布了更多代码,让我们用您的示例和数据结构进行测试。下面是xaml和c#的代码。必须使用一些硬编码值进行测试。是否使用筛选器将项目限制为20?基于某些属性限制项目,您可以查看CloudFilter(),基于属性值,例如,如果property.Contains(“Japan”),则它仅显示与术语Japan相关的记录,计数不必为20。我编辑了这个问题,并发布了更多代码,让我们用您的示例和数据结构进行测试。下面是xaml和c#的代码。Hav将使用一些硬编码值进行测试。“ItemsControl不支持UI虚拟化”“请使用列表框或使ItemsControl UI虚拟化。”。如果它不支持虚拟化,您如何将其UI虚拟化。没有意义。@Konrad也许更好的说法是,“不支持开箱即用的UI虚拟化”“ItemsControl不支持UI虚拟化”“使用列表框或使ItemsControl UI虚拟化。”。如果它不支持虚拟化,您如何将其UI虚拟化。没有意义。@Konrad也许更好的说法是,“不支持开箱即用的UI虚拟化”
    ICollectionView dataView = CollectionViewSource.GetDefaultView(shelfGridView.ItemsSource);
    dataView.Filter = CloudFilter;
    dataView.Refresh();
    private bool CloudFilter(object item)
    {
    MyObject lib = item as MyObject;
    return lib.Property !=valuetofilter; 
    }