我的窗口中有一个ListView
。 ListView
的默认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准备好之前,主窗口仍然没有响应。
答案 0 :(得分:2)
将命名空间添加到XAML:
xmlns:mwc="clr-namespace:MyWinCollection"
使用VirtualizingWrapPanel
作为ListView
的{{1}}:
ItemsTemplate
完成!
由于并非所有项目都是一次渲染,因此主窗口现在完全响应。
希望有这个帮助! :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
}));
});
}