加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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线程上加载项目(如另一个答案中所述).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读