GridView 丢失了对非索引位置中的项目的跟踪,并且许多项目不再显示

2024-01-11

我正在使用 UWP 应用程序FileInformationFactory检索文件对象的虚拟化向量,该向量被转换为FileInformation并显示在GridView.

我想查询插入笔记本电脑的 SD 卡上的文件夹并比较该文件夹的虚拟化情况GridView当此文件夹位于FullyIndexed位置,例如我的桌面。

该 SD 卡有一个包含 15,000 个零字节文本文件的文件夹。每个文件都有命名x.txt其中 x 的范围是 1-15000(这可以通过单击下面代码中的“添加”按钮在您选择的文件夹中生成;在我的机器上需要一分钟左右的时间,但请记住只执行一次!)。

结果显示在GridView我在其中显示每个文件的名称。

In a FullyIndexed我可以上下滚动的位置GridView非常快,即使使用垂直滚动条也非常快且不稳定,并且GridView尽管会有几秒钟的延迟,但总是会设法显示每个文件的名称。

In a NotIndexed在 SD 卡或外部硬盘等位置,当我缓慢滚动时 GridView 会显示项目,但当我上下滚动太快时,GridView 会很快失去对项目的跟踪,例如当我的触控板使用垂直滚动条时。等待没有帮助。该应用程序仍然响应,但没有任何显示。即使向上滚动到顶部,也仅显示第一个元素名称,唯一的选择是重新显示整体并平滑滚动。

我怎样才能解决这个问题NotIndexed地点?我不想将文件一一检索到内存中,因为这会占用太多时间,而且对于真实照片来说,会很快耗尽用户的 RAM。因此使用GetVirtualizedFilesVector.

我以为这将是 GridView 的虚拟化,但事实似乎并非如此,而且该应用程序可以很好地处理真实的 17k 照片,但只能在FullyIndexed地点。 谢谢

<Page
x:Class="Virtualization.Scenario4"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:ba="using:Windows.Storage.BulkAccess"
xmlns:local="using:Virtualization"
mc:Ignorable="d"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="auto"/>
        <RowDefinition Height="*"/>
        <RowDefinition Height="auto"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="auto"/>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="auto"/>
        <ColumnDefinition Width="48"/>
    </Grid.ColumnDefinitions>
    <StackPanel Grid.ColumnSpan="1" Orientation="Horizontal"
                BorderThickness="0,0,2,2">
        <AppBarButton x:Name="FolderPickerButton" Icon="Folder"
                      LabelPosition="Collapsed" Label="Select Folder"
                      Click="FolderPickerButton_Click"/>
        <AppBarButton Icon="ViewAll"
                      LabelPosition="Collapsed"
                      Click="ViewAllAppBarButton_Click"/>
        <AppBarButton Icon="Add"
                      LabelPosition="Collapsed"
                      Click="AddFilesAppBarButton_Click"/>
        <AppBarSeparator/>
    </StackPanel>
    <GridView Grid.Row="1" Grid.Column="1"
              ItemsSource="{x:Bind ItemCollectionView, Mode=OneWay}" IsItemClickEnabled="True" ItemClick="GridView_ItemClick">
        <GridView.ItemTemplate>
            <DataTemplate x:DataType="ba:FileInformation">
                <Grid>
                    <TextBlock MinWidth="80" Text="{Binding Name}" TextWrapping="WrapWholeWords"/>
                </Grid>
            </DataTemplate>
        </GridView.ItemTemplate>
    </GridView>

    <ListView Grid.Row="1" Grid.Column="2" ItemsSource="{x:Bind Information, Mode=OneWay}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding}"/>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

</Grid>
public sealed partial class Scenario4 : Page, INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged([CallerMemberName] string propertyName = null)
      => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    public Scenario4()
    {
        this.InitializeComponent();
    }

    private ICollectionView _fileCollectionView;
    private StorageFolder _folder;
    private IStorageQueryResultBase _query;
    private FileInformationFactory _fileInformationFactory;
    private object _vector;

    public CollectionViewSource CollectionViewSource { get; set; } = new CollectionViewSource();
    public ICollectionView ItemCollectionView
    {
        get { return _fileCollectionView; }
        set
        {
            if (_fileCollectionView != value)
            {
                _fileCollectionView = value;
                OnPropertyChanged(nameof(ItemCollectionView));
            }
        }
    }
    public ObservableCollection<string> Information { get; private set; } = new ObservableCollection<string>();

    private async void FolderPickerButton_Click(object sender, RoutedEventArgs e)
    {
        var _pickedFolder = await PickFolderAsync();
        if (_pickedFolder == null)
        {
            Information.Add("Choose a folder");
            return;
        }
        Information.Add("Generate 15k files with the Add button if not done already, otherwise click the ViewAll button");
        _folder = _pickedFolder;
    }

    private async void Query_ContentsChanged(IStorageQueryResultBase sender, object args)
    {
        await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>
        {
            Information.Add($"Contents Changed {sender.Folder.Name} {args}");
        });
    }

    private void View_VectorChanged(IObservableVector<object> sender, IVectorChangedEventArgs @event)
    {
        if (@event.CollectionChange == CollectionChange.Reset)
        {
            Information.Add($"Vector Changed {@event.CollectionChange} ItemCount: {sender.Count} Index: {@event.Index}");
        }
    }


    private static async Task<StorageFolder> PickFolderAsync()
    {
        var folderPicker = new FolderPicker
        {
            SuggestedStartLocation = PickerLocationId.Desktop,
            ViewMode = PickerViewMode.Thumbnail
        };

        folderPicker.FileTypeFilter.Add("*");

        var _pickedFolder = await folderPicker.PickSingleFolderAsync();
        return _pickedFolder;
    }

    private void GridView_ItemClick(object sender, ItemClickEventArgs e)
    {
        if (e.ClickedItem is FileInformation fileInformation)
        {
            Information.Add(fileInformation.Name);
        }
        else
        {
            if (e.ClickedItem == null)
            {
                Information.Add("Null");
            }
            else
            {
                Information.Add(e.ClickedItem.ToString());
            }
        }
    }

    private async void AddFilesAppBarButton_Click(object sender, RoutedEventArgs e)
    {

        for (int i = 1; i <= 15000; i++)
        {
            await _folder.CreateFileAsync(i + ".txt", CreationCollisionOption.ReplaceExisting);
            if (i % 250 == 0)
            {
                Information.Add(i.ToString());
            }
        }
    }

    private async void ViewAllAppBarButton_Click(object sender, RoutedEventArgs e)
    {
        if (_folder == null)
        {
            Information.Add("Choose folder first");
            return;
        }
        var state = await _folder.GetIndexedStateAsync();

        var queryOptions = new QueryOptions { FolderDepth = FolderDepth.Deep, IndexerOption = IndexerOption.UseIndexerWhenAvailable };


        Information.Add($"{_folder.Name} is {state} {queryOptions.IndexerOption}");

        _query = _folder.CreateFileQueryWithOptions(queryOptions);

        var st = Stopwatch.StartNew();
        var numOfFiles = (await _query.GetItemCountAsync());
        st.Stop();

        Information.Add($"{state} {queryOptions.IndexerOption}. Found {numOfFiles} in {st.ElapsedMilliseconds / 1000.0}");
        if (numOfFiles==0)
        {
            Information.Add("Generate files by clicking the Add button");
            return;
        }
        _fileInformationFactory = new FileInformationFactory(_query, ThumbnailMode.SingleItem, Constants.Thumbnail_Size,
           ThumbnailOptions.UseCurrentScale, delayLoad: false);

        _vector = _fileInformationFactory.GetVirtualizedFilesVector();
        CollectionViewSource.Source = _vector;

        ItemCollectionView = CollectionViewSource.View;
        _query.ContentsChanged += Query_ContentsChanged;
        CollectionViewSource.View.VectorChanged += View_VectorChanged;
    }
}

For Constants.Thumbnail_Size,将其设置为例如100.

Addendum

该问题与外部硬盘驱动器无关。我在现代 Thinkpad X1 Yoga 3rd Gen 上创建了一个未索引的分区。该问题已重现。


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GridView 丢失了对非索引位置中的项目的跟踪,并且许多项目不再显示 的相关文章

  • Windows 10 Mobile (10.0.14393) 地理围栏后台任务 (LocationTrigger)

    自从10 0 14393 周年纪念更新 LocationTrigger似乎不起作用 我有 Windows Phone 8 1 应用程序 也适用于 UWP 应用程序 输出到的便携式库Windows Runtime Component图书馆 w
  • 两种类型的回发事件

    1 我发现了两篇文章 每篇文章对两种类型的回发事件的分类都略有不同 一位资源说两种类型的回发事件是Changed事件 其中控件实现 IPostbackDataHandler 当数据在回发之间更改时触发 然后Raised事件 其中控件实现 I
  • 如何在 Visual Studio for Mac 上开发 Windows 应用程序

    我最近购买了一台iMac 以便在更好的环境中在Visual Studio for Mac上开发我的应用程序 Windows上有很多问题 但是在Visual Studio for mac上 没有UWP项目 据了解 我必须创建一个新的 NET
  • 如何创建可点击的gridview行?

    我想创建一个 gridview 行 其中整行都是可单击的 当我单击该行上的任意位置时 它会打开另一个包含行信息的 aspx 页面 我正在使用 asp net 和 C 任何人都可以帮助我吗 提前致谢 触发 Gridview 的两个事件 OnR
  • UWP 无法在两个应用程序之间创建本地主机连接

    我正在尝试在两个 UWP 应用程序之间设置 TCP 连接 当服务器和客户端在同一个应用程序中运行时 它可以正常工作 但是 当我将服务器部分移动到一个应用程序并将客户端部分移动到另一个应用程序时 ConnectAsync 会引发异常 服务器未
  • ExtendedExecutionSession :我们可以像桌面应用程序一样运行 UWP 而无需挂起吗?

    我计划启动一个 UWP 应用程序来监视 365 天的传感器数据并将所有数据保存到数据库 Sqlite 我仍然担心 UWP 功能 请建议我应该使用哪个 UWP WPF 我想使用更好的 UI 而不是 如果可能的话我想使用 UWP UWP 挂起是
  • 滚动查看器无法在网格上工作

    您好 我正在 Windows 10 中学习 UWP 我需要滚动网格 他们有两段代码很相似 我的本意是在grid2中滚动 第一段代码
  • Yii2:使用 Pjax POST 方法和分页在 Gridview 中搜索

    我是 yii2 的初学者 尝试在搜索按钮上使用 Pjax 来搜索 Gridview 中的字段 我已经使用 GET 方法完成此操作 但我想使用 POST 方法完成此操作 那么我该如何使用 Yii2 Pjax post 方法 和分页来做到这一点
  • ASP.NET 数据集 getdataBy 无法启用约束。一行或多行包含违反非空、唯一或外键约束的值

    你好 我有一个非常简单的网络表单 我在此表单上有一个按钮和一个网格视图 以及一个包含链接表 bill docket docket bill 等的数据集 在按钮上单击我使用以下代码 protected void button click ob
  • 如何在asp.net中按下按钮后刷新Gridview

    我正在尝试制作一个简单的图书馆数据库 我在网格视图中列出搜索结果 然后有一个文本框和一个按钮 用户输入 isbn 并单击贷款按钮 然后 如果有足够数量的物品 itemNumber gt 0 则由用户借出 这是用户界面的屏幕截图 我的问题是
  • 在后台任务中设置壁纸

    我想从后台任务的存储文件夹中获取所有图像 首先在app entering后台方法中注册一个后台任务 我还可以调试 Run 方法 但所有等待方法都不起作用 public void Run IBackgroundTaskInstance tas
  • 检查 UWP 应用程序是否位于前台/聚焦[重复]

    这个问题在这里已经有答案了 我想检查当前应用程序是否位于前台 聚焦 该应用程序是 Windows 10 UWP 应用程序 我已经得到的是 检查当前应用程序是否最小化 为此我使用VisibilityChanged的事件Window Curre
  • 隐藏 AppBar 中的省略号

    当您在 UWP 应用中创建 AppBar 或 CommandBar 时 控件侧面附近总会隐藏一个省略号 如下所示 我不想在我的应用程序中使用它 但我没有在其中找到任何方法 属性AppBar这会帮助我摆脱它 这应该是可能的 因为许多默认的 W
  • 更改 UWP 应用的目标设备

    我希望我的 Windows UWP 应用程序仅针对特定设备 例如桌面和移动设备 如何指定我的应用程序应仅针对这些设备 我没有发现任何感兴趣的内容Package appxmanifest文件 以及project json仅指定应用程序应使用的
  • UWP 关闭信息亭模式

    我有一个发布到 Windows 应用商店的 UWP 应用程序 并且该应用程序可以启动进入信息亭模式 分配访问权限 它工作得很好 但我尝试在应用程序上创建一个按钮来关闭信息亭模式并返回到 Windows 登录屏幕 我尝试了文档中给出的代码 h
  • 单击 GridView 查找选定行

    我正在尝试获取 GridView 并从单击的行中获取数据 我已经尝试了下面的代码 当我单击该行时 我会返回选定的索引 但是当我查看 GridView 中的实际行时 它们显示为空 不知道我错过了什么 ASP 使我的网格
  • ASP.NET 设置 GridView 列最大宽度大小

    我在 VS2005 上使用 ASP NET C 我有一个 GridView 表 其中有一列名为Description 并且由于输入总是很长 因此描述在水平方向上也很长 我希望 GridView 的所有列都有最大宽度 我尝试了很多方法 但没有
  • 将网格视图列的宽度设置为动态,而不影响控件的最小宽度

    我在用着
  • 如何使用 BoundFields 将 FooterTemplate 添加到 GridView

    希望您周末愉快 终于我有了一些编辑 删除事件器来与 LINQ 支持一起工作 我有一个添加记录事件 我知道它正在工作 但是在尝试了一部分之后 我不知道如何在页脚中添加一些文本框 所以它是从页眉到页脚的一行 没有向右或向左移动 有人可以帮助我吗
  • 控件更改时 ObjectDataSource 创建两次

    我将 ObjectDataSource 与 GridView 一起使用 并在代码隐藏中使用 OnObjectCreated 处理程序 如果我以编程方式更改 GridView 上的子控件值 则整个控件会在同一请求中再次进行数据绑定 如 OnO

随机推荐

  • Android 分享来自 url 的图像

    我想使用以下代码共享图像 Intent sharingIntent new Intent Intent ACTION SEND Uri imageUri Uri parse http stacktoheap com images stack
  • Azure 数据库的密码重置

    我有一个新的 Azure 帐户 我能够以管理员身份登录 管理 页面 但我忘记了其中一个数据库的密码 我想重置该数据库的密码 我怎么做 微软似乎没有关于这方面的知识库 至少我找不到 谢谢 如果您指的是特定 Windows Azure SQL
  • 根据条件每行中第一次出现的位置

    我有下表 其中包含有序变量 table lt data frame Ident c Id 01 Id 02 Id 03 Id 04 Id 05 Id 06 X01 c NA 18 0 14 0 NA X02 c 0 16 0 17 0 53
  • 使用 iframe 停止 Comet 的浏览器抖动

    当我通过 iframe 推送使用 comet 时 当数据通过 iframe 推送时 浏览器颤动器将永远保持旋转 Lightstreamer 也在使用 iframe 但是他们如何设法让它停止呢 我发现了一个类似的帖子here https st
  • 为什么 Google Analytics(分析)显示的访问次数少于 One&One 统计数据?

    将谷歌分析结果与 one one 托管的每月统计数据进行比较显示出巨大的差异 上个月 Google 显示 1046 次访问 One one 统计数据显示 15304 次独立访问 谷歌代码位于每个页面上出现的页脚中 我知道 ga 只适用于启用
  • event.preventDefault() 或 return false 在 IE9 中不起作用

    我试图让以下代码在所有版本的 IE 中工作 就像它在其他浏览器中工作一样 a href class specificClass Click Me a Javascript specificClass click function e e p
  • Visual Studio 64 位?

    有 64 位 Visual Studio 吗 为什么不 由于多种原因 No 为何在此解释MSDN 帖子 https web archive org web 20160309232651 http blogs msdn com b ricom
  • 覆盖 WPF 中的静态资源

    我想覆盖StaticResource这是在我自己的资源字典中的不同程序集的资源字典中配置的 我尝试使用相同的密钥配置新资源 但没有成功 实际加载的资源来自所提到的程序集的资源字典 出于演示目的 我将资源称为 MyResource MyRes
  • FactoryFinder 性能/缓存不良

    我有一个相当大的 java ee 应用程序 它有一个巨大的类路径 可以进行大量的 xml 处理 目前 我正在尝试加快一些功能的速度 并通过采样分析器找到缓慢的代码路径 我注意到的一件事是 特别是我们的代码中 我们有像这样的调用的部分Tran
  • 使用管道而不提供第一个参数

    Is the gt 管道运算符总是将左侧 LHS 提供给右侧 RHS 的第一个参数 即使在 RHS 调用中再次指定第一个参数 假设我想指定要使用的变量cor library magrittr iris gt cor x Sepal Leng
  • Tensorflow Dataset API:带有 parquet 文件的输入管道

    我正在尝试使用 Dataset API 设计输入管道 我正在处理镶木地板文件 将它们添加到我的管道中的好方法是什么 我们已经发布了万能风暴 https github com uber petastorm 一个开源库 允许您通过 Tensor
  • 提示使用自定义目录查找 .cmake 文件

    在 CMake 中 有没有办法制作内置的 Find 脚本来优先考虑我们指定的自定义目录 因为特别是在 Windows 中 模块查找脚本通常无法检测到模块 例如 Visual Studio 目录 因此我通常必须手动设置外部库的路径 这非常累人
  • 颤振回调函数

    我有一个数量需要在父小部件中更新 按子小部件中的 或 图标时需要更新数量 我将回调函数传递给了子无状态小部件 但它不起作用 相反 我收到一条错误消息 指出在构建期间调用了 setstate 或 markneedsbuild 这是父小部件 c
  • 如何在第一列中应用文本左对齐,在其他列中应用文本右对齐

    我有一张桌子要设计 我该如何申请text align left 仅适用于第一列和text align right 对于其他列 这是我的表示例 http jsfiddle net gianlucaguarini hAv7P http jsfi
  • 在 Javascript 中克隆文件输入元素

    我有一个文件输入元素 需要在用户浏览并选择要上传的文件后进行克隆 我开始使用 obj cloneNode 一切正常 直到我尝试在 IE 中使用它 此后我尝试使用 jQuery 的克隆方法 如下所示 var tmp jQuery catego
  • Multipart._final 中的表单意外结束

    我有多个输入 当所有图像输入字段都填满时 上传工作正常 但如果其中任何一个为空 它会在我的服务器端引发错误 Unexpected end of form at mutipart 这是客户端 const handelSubmit e gt e
  • 如何使用 Unity 依赖注入 Web API 实现策略/外观模式

    如何告诉Unity WebApi依赖注入框架 在正确的控制器中注入正确的类 DI 项目容器 public class UnityContainerConfig private static IUnityContainer unityCont
  • PowerShell 3.0 中 [ordered] 的正确名称是什么?

    在 PowerShell 中 您可以使用方括号指定类型 如下所示 PS C Users zippy gt int IsPublic IsSerial Name BaseType True True Int32 System ValueTyp
  • 如何发送ctrl+z

    How do I convert ctrl z to a string 我将此作为 AT 命令发送到该计算机的连接设备 Basically I just to put some chars in a string and ctrl z in
  • GridView 丢失了对非索引位置中的项目的跟踪,并且许多项目不再显示

    我正在使用 UWP 应用程序FileInformationFactory检索文件对象的虚拟化向量 该向量被转换为FileInformation并显示在GridView 我想查询插入笔记本电脑的 SD 卡上的文件夹并比较该文件夹的虚拟化情况G