Я извлекаю свойство FileInformation.DisplayName
примерно 5k файлов в папке, используя FileInformationFactory.GetVirtualizedFilesVector()
, чтобы отобразить их в GridView в UWP через CollectionViewSource
. Пока работает дисплей, мне не удается получить правильное количество найденных элементов. Я знаю, что могу сделать это, ожидая 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
привязан к GridView
. Однако FileCollectionViewSource.View.Count
возвращает 0 на этом этапе. Если сейчас я нажму на кнопку обновления RefreshAppBarButton_Click
, то будет возвращено точное количество.
Я могу себе представить, что FileCollectionViewSource.View
нужно некоторое время для урегулирования, и, действительно, установка await Task.Delay(1000)
перед печатью FileCollectionViewSource.View.Count
работает, но я ищу способ обновить TextBlock
, когда FileCollectionViewSource.View
сделано.
Есть ли способ сделать это автоматически по какому-либо событию или другому? Спасибо!