将WrapPanel虚拟化为ListView的ItemsTemplate

时间:2015-09-22 15:17:13

标签: c# wpf listview

我的窗口中有一个ListViewListView的默认ItemsPanel已替换为WrapPanel。我的DataTemplate也有ListViewItem。在运行时,主窗口将不会响应一段时间,因为ListView具有超过700(并且不断增加)ListViewItem s(来自数据绑定)。有没有办法让主窗口保持响应?

可选:当ListView未准备就绪时,我希望文本(或ProgressBar,如果可能的话)显示在ListView上并说出类似"请等待。 .."或者可能"正在加载项目..."。

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,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准备好之前,主窗口仍然没有响应。

2 个答案:

答案 0 :(得分:2)

谷歌搜索了一段时间后。 Thx到this文章,Virtualizing WrapPanel并非不可能!方法如下:

  1. here
  2. 下载代码
  3. 将其添加到您的项目中(在VS2010中:项目&gt;添加现有项目)
  4. 将命名空间添加到XAML:

    xmlns:mwc="clr-namespace:MyWinCollection"
    
  5. 使用VirtualizingWrapPanel作为ListView的{​​{1}}:

    ItemsTemplate
  6. 完成!

    由于并非所有项目都是一次渲染,因此主窗口现在完全响应。

    希望有这个帮助! :d

    不,伙计们!你们救了我的一天。

答案 1 :(得分:1)

如果UI线程正在进行长时间操作,则无法处理UI请求。这也称为无响应。像这样使用ThreadPool

private void operation_Click(object sender, RoutedEventArgs e)
{

 ThreadPool.QueueUserWorkItem(_ =>

    {
      var result = LongTimeOperation();//set the operation in another thread so that the UI thread is kept responding
      //use the Dispatcher to "return" to the UI thread
      Dispatcher.BeginInvoke(new Action(() =>
      {
         //Use result
      }));
    });
}