Wpf ItemsControl渲染缓慢
我使用ItemsControl来显示项目列表,itrs xaml如下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 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虚拟化:
ItemsPanel
设置为virtualzingstackpanel
ControlTemplate
,并将ItemsPresenter
包装在ScrollViewer
内部此外,您正在将
ItemsSource
直接设置为SourceCollection,即ShelfItemsCollection
,然后通过在该集合下方创建defaultview对其进行过滤。直接与sourceCollection绑定将强制ItemsControl
(当然是非虚拟化的)生成100个容器来承载底层对象
相反,您应该创建带有过滤器谓词的ICollectionView
,并将ItemsSource
绑定到该实例。您还可以创建CollectionViewSource
并与之绑定。如果您绑定过滤实例,它将只生成20个容器(非虚拟化ItemsControl)。
当然,在ItemsControl上启用UI虚拟化将只为GUI上可见的UI项生成容器。ItemsControl不支持开箱即用的UI虚拟化。使用ListBox或使ItemsControl UI虚拟化 您可以通过以下步骤在ItemsControl上启用UI虚拟化:
ItemsPanel
设置为virtualzingstackpanel
ControlTemplate
,并将ItemsPresenter
包装在ScrollViewer
内部此外,您正在将
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;
}