【问题标题】:ItemsControl rendering slowlyItemsControl 渲染缓慢
【发布时间】:2014-03-07 05:23:43
【问题描述】:

我正在使用 ItemsControl 来显示项目列表,它的 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>

我面临的问题是我在列表中有近 100 个项目,我正在根据某些属性对列表进行一些过滤操作,并将结果限制为较小的否(一次说 20 个项目)进行此过滤刷新和加载列表视图花了很多时间。 这是我用来过滤的代码

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; 
} 

有什么方法可以提高性能或渲染缓慢的任何具体原因吗?

【问题讨论】:

  • 您是否使用过滤器将项目限制为20?
  • 根据某些属性限制项目,你可以看到 CloudFilter() ,基于属性值,例如如果 property.Contains("Japan") ,那么它只显示与术语日本相关的记录,计数不一定是 20。我也编辑了问题
  • 发布更多代码,让我们用您的示例和数据结构进行测试。
  • pastebin.com/3CRBLnU2 这里是 xaml 和 c# 的代码。必须使用一些硬编码值进行测试。

标签: wpf c#-4.0 wpf-controls itemscontrol


【解决方案1】:

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

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

  1. 在 ItemsControl 上设置 VirtualizingStackPanel.IsVirtualizing="True"
  2. ItemsPanel 设置为VirtualizingStackPanel
  3. 覆盖 ItemsControl 的 ControlTemplate 并将 ItemsPresenter 包裹在 ScrollViewer 内。
  4. 在 ItemsControl 上设置 ScrollViewer.CanContentScroll="True"

上述提案的详细信息可以在here找到。


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

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

【讨论】:

  • “ItemsControl 不支持 UI 虚拟化”“要么使用 ListBox,要么使 ItemsControl UI 虚拟化。”。如果它不支持虚拟化,如何将其 UI 虚拟化。没有意义。
  • @Konrad 也许更好的措辞是“不支持开箱即用的 UI 虚拟化”
猜你喜欢
  • 2020-12-06
  • 1970-01-01
  • 2021-06-04
  • 2017-09-06
  • 1970-01-01
  • 1970-01-01
  • 2012-01-30
  • 2019-09-02
  • 2016-08-24
相关资源
最近更新 更多