问题描述
我需要使用 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 (将#修改为@)