ListView:使用 WrapPanel 和分组时滚动冻结并且非常滞后

问题描述

我需要使用 wrappanel 在我的 ListView 中显示大约 500 个项目。
但是,如果我想滚动它,用户界面就会冻结,几秒钟后,它开始滚动,但是它非常滞后且无法控制。
这是我的 ListView 的 xaml 代码:

<!-- Main Content -->
        <Grid
            Grid.Row="1"
            Margin="14,5,20,20">
            <ListView
                Background="Transparent"
                BorderBrush="Transparent"
                ScrollViewer.CanContentScroll="True"
                ScrollViewer.HorizontalScrollBarVisibility="Disabled"
                ScrollViewer.VerticalScrollBarVisibility="Hidden"
                ItemTemplate="{StaticResource ProxyItemTemplate}"
                VirtualizingPanel.IsContainerVirtualizable="True"
                VirtualizingPanel.IsVirtualizing="True"
                VirtualizingStackPanel.VirtualizationMode="Recycling"
                SelectionChanged="ProxyListView_SelectionChanged"
                SelectionMode="Single"
                x:Name="ProxyListView">
                <ListView.ItemContainerStyle>
                    <Style TargetType="ListViewItem">
                        <Setter Property="Margin" Value="0,5"/>
                    </Style>
                </ListView.ItemContainerStyle>
                <ListView.GroupStyle>
                    <GroupStyle>
                        <GroupStyle.ContainerStyle>
                            <Style TargetType="{x:Type GroupItem}">
                                <Setter Property="Template">
                                    <Setter.Value>
                                        <ControlTemplate>
                                            <Expander IsExpanded="True">
                                                <Expander.Header>
                                                    <StackPanel Orientation="Horizontal">
                                                        <emoji:TextBlock Text="{Binding Name}" FontSize="18"/>
                                                    </StackPanel>
                                                </Expander.Header>
                                                <ItemsPresenter/>
                                            </Expander>
                                        </ControlTemplate>
                                    </Setter.Value>
                                </Setter>
                            </Style>
                        </GroupStyle.ContainerStyle>
                    </GroupStyle>
                </ListView.GroupStyle>
                <ListView.ItemsPanel>
                    <ItemsPanelTemplate x:Name="ItemsPanelTemplate">
                        <WrapPanel/>
                    </ItemsPanelTemplate>
                </ListView.ItemsPanel>
            </ListView>
        </Grid>

这是它背后的代码(用于设置 itemsource 和 group 属性):

private ObservableCollection<ProxyItem> ProxyItemCollection = new ObservableCollection<ProxyItem>();
ProxyListView.ItemsSource = ProxyItemCollection;
CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(ProxyListView.ItemsSource);
PropertyGroupDescription groupDescription = new PropertyGroupDescription("Group");
view.GroupDescriptions.Add(groupDescription);

每次加载页面时,我使用以下代码从http api中删除所有项目和查询:

if (ProxyItemCollection.Count > 0)
    Dispatcher.Invoke(new Action(() =>
    {
        ProxyItemCollection.Clear();
    }));

var groups = proxies.Proxies.Where(p => p.Type.IsPolicyGroup());
foreach (var group in groups)
{
    foreach (var proxyName in group.All)
    {
        var matchedProxy = proxies.Proxies.FirstOrDefault(p => p.Name == proxyName);
        ProxyItem proxyItem = new ProxyItem
        {
            Name = proxyName,Type = matchedProxy.Type.IsPolicyGroup() ? $"{matchedProxy.Type} - {matchedProxy.Now}" : matchedProxy.Type.ToString(),Group = group.Name,IsSelected = matchedProxy.Name == group.Now
        };
        Dispatcher.Invoke(new Action(() =>
        {
            ProxyItemCollection.Add(proxyItem);
        }));
    }
}

我用DateTime来测量添加项目消耗的时间,好像只过去了两秒。我的代码有什么问题还是ListView的一个bug?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)