我正在使用FileInformation.DisplayName
检索文件夹中大约5k文件的FileInformationFactory.GetVirtualizedFilesVector()
属性,以通过CollectionViewSource
在UWP的GridView中显示它们。当显示正常时,我无法正确获取已检索到的项目数。
我知道我可以通过等待GetFilesAsync
并进行计数来做到这一点,但这扼杀了使用虚拟化矢量的速度目的,因此我想避免使用它。
这是XAML
xmlns:ba="using:Windows.Storage.Bulkaccess"
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<StackPanel Margin="16">
<StackPanel Orientation="Horizontal">
<AppBarButton Icon="Folder" Click="AppBarButton_Click" LabelPosition="Collapsed"/>
<AppBarButton Icon="Refresh" Click="RefreshAppBarButton_Click" LabelPosition="Collapsed"/>
</StackPanel>
<TextBlock x:Name="infoTextBlock" FontWeight="Medium"/>
</StackPanel>
<GridView Grid.Row="1" Grid.Column="1"
ItemsSource="{x:Bind FileCollectionViewSource.View,Mode=OneWay}">
<GridView.ItemTemplate>
<DataTemplate x:DataType="ba:FileInformation">
<TextBlock Text="{x:Bind DisplayName}"/>
</DataTemplate>
</GridView.ItemTemplate>
</GridView>
</Grid>
以及背后的代码
private StorageFolder _folder;
public CollectionViewSource FileCollectionViewSource { get; set; } = new CollectionViewSource();
private async void AppBarButton_Click(object sender,RoutedEventArgs e)
{
var folderPicker = new FolderPicker
{
SuggestedStartLocation = PickerLocationId.Pictureslibrary,ViewMode = PickerViewMode.Thumbnail
};
folderPicker.FileTypeFilter.Add("*");
_folder = await folderPicker.PickSingleFolderAsync();
if (_folder != null)
{
GetFileVectors();
}
else
{
infoTextBlock.Text = "Pick folder";
}
}
private void GetFileVectors()
{
var queryOptions = new QueryOptions
{
FolderDepth = FolderDepth.Deep,IndexerOption = IndexerOption.UseIndexerWhenAvailable
};
var fileQuery = _folder.CreateFileQueryWithOptions(queryOptions);
var fileInformationFactory = new FileInformationFactory(fileQuery,ThumbnailMode.SingleItem,Constants.Thumbnail_Size,ThumbnailOptions.UseCurrentScale,false);
var filesVector = fileInformationFactory.GetVirtualizedFilesVector();
FileCollectionViewSource.Source = filesVector;
var count = FileCollectionViewSource.View.Count;
infoTextBlock.Text = $"View count {count}";//Returns 0
}
private void RefreshAppBarButton_Click(object sender,RoutedEventArgs e)
{
infoTextBlock.Text = $"View count {FileCollectionViewSource.View.Count}";//returns the correct count
}
结果:
当我选择一个文件夹时,方法GetFileVectors()被调用,它执行批量搜索并设置FileCollectionViewSource.Source = filesVector;
,并且FileCollectionViewSource.View
被绑定到OneWay
的{{1}}上。但是,GridView
在此阶段返回0。
如果现在单击刷新按钮FileCollectionViewSource.View.Count
,则返回准确的计数。
我可以想象RefreshAppBarButton_Click
需要一些时间来解决,并且确实在打印出FileCollectionViewSource.View
之前设置await Task.Delay(1000)
是可行的,但是我正在寻找一种更新{{1 }}完成FileCollectionViewSource.View.Count
后。
是否可以通过某种事件或其他方式自动执行此操作? 谢谢!