c# – 将WrapPanel虚拟化为ListView的ItemsTemplate
发布时间:2020-12-15 23:27:27 所属栏目:百科 来源:网络整理
导读:我的窗口中有一个ListView. ListView的默认ItemsPanel已替换为WrapPanel.我还有一个DataTemplate,它的ListViewItems.在运行时,主窗口将不会响应一段时间,因为ListView具有超过700(并且不断增加)ListViewItems(来自数据绑定).有没有办法让主窗口保持响应? 可
我的窗口中有一个ListView. ListView的默认ItemsPanel已替换为WrapPanel.我还有一个DataTemplate,它的ListViewItems.在运行时,主窗口将不会响应一段时间,因为ListView具有超过700(并且不断增加)ListViewItems(来自数据绑定).有没有办法让主窗口保持响应?
可选:当ListView没有准备好时,我希望在ListView上显示一个文本(或可能的ProgressBar)并说出“Please Wait …”或“Loading Items …”之类的内容. XAML: <ListView x:Name="MyListView" VirtualizingPanel.IsVirtualizing="True" VirtualizingPanel.VirtualizationMode="Recycling" HorizontalAlignment="Left" Height="577" VerticalAlignment="Top" Width="902" ScrollViewer.HorizontalScrollBarVisibility="Auto" Foreground="Black" Margin="10,10,0" ScrollViewer.CanContentScroll="True" BorderBrush="#FFC54B4B" BorderThickness="3" Background="White"> <ListView.ItemsPanel> <ItemsPanelTemplate> <WrapPanel MaxWidth="{Binding (FrameworkElement.ActualWidth),RelativeSource={RelativeSource AncestorType=ScrollContentPresenter}}" ItemWidth="{Binding (ListView.View).ItemWidth,RelativeSource={RelativeSource AncestorType=ListView}}" MinWidth="{Binding ItemWidth,RelativeSource={RelativeSource Self}}" ItemHeight="{Binding (ListView.View).ItemHeight,RelativeSource={RelativeSource AncestorType=ListView}}" /> </ItemsPanelTemplate> </ListView.ItemsPanel> </ListView> 编辑: 我试过这个: List<something> MyList = new List<something>(); ThreadPool.QueueUserWorkItem(_ => { ( Create MyList here...) Dispatcher.BeginInvoke(new Action(() => { MyListView.ItemsSource = MyList; })); }); 在ListView准备好之前,主窗口仍然没有响应. 解决方法
您使用无法进行UI虚拟化的面板(WrapPanel)(与默认ListView ItemPanel模板中使用的VirtualizingStackPanel不同).这意味着你所有的物品都被渲染,即使是那些目前看不到的物品.据我所知,WPF没有内置的虚拟化包装面板,所以你可以尝试一些免费的虚拟化包装面板(例如-
http://virtualwrappanel.codeplex.com/),但我不能说它们有多好,我使用Telerik的版本不是免费的.另一个选项是切换回VirtualizingStackPanel.除此之外,请确保在非UI线程上加载项目(如另一个答案中所述).
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |