问题标签 [virtualizingstackpanel]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
759 浏览

c# - 是否可以在 FlipView 中使用 VirtualizingStackPanel?

目前我的 FlipView 允许用户从本地 Pictures 文件夹中选择多张图片,然后在 FlipView 中显示选定的图像。但是,它仅在用户选择少量图片时才有效。When too many large images are selected, the app crashes. 我读到 VirtualizingStackPanel 将 3 个图像存储在内存中(之前、当前、之后),因此并非所有图像都一次加载。

这是我的 FlipView(11 月 14 日编辑)。

0 投票
2 回答
4218 浏览

wpf - 在 ScrollViewer 中对 WPF DataGrid 使用虚拟化

我知道 DataGrid 支持虚拟化,因此它只为可见行创建网格单元。但是,这似乎只有在 DataGrid 的大小受到限制时才有效。

在我的场景中,一个 DataGrid 被放置在一个滚动查看器中,就像这样

这似乎打破了虚拟化。在 DataGrid 应该显示大量项目的情况下,可视化树变得非常非常大,甚至在外部 ScrollViewer 中向下滚动之前也是如此。

有什么方法可以防止 DataGrid 预先创建所有单元格,而是在 ScrollViewer 向下滚动时创建它们?

编辑:基本上托管这个的页面应该像一个网页,顶部有一些文本,一个大表格,底部有更多文本。而不是顶部/底部始终可见并且仅滚动网格的dockview,整个页面应该滚动。该设置实现了这一点,但会受到预先创建的所有内容的影响。

另一个编辑:有没有办法检测数据网格的特定行被滚动到视图中?典型的延迟加载文章使用数据网格的滚动查看器向网格添加更多项目,这在此处不起作用。

0 投票
1 回答
4403 浏览

c# - DataGrid 中的虚拟化面板

我最近开始探索 WPF 中的数据和 UI 虚拟化功能,并偶然发现了一些奇怪的东西。

我创建了一个启用的DataGrid'sVirtualizing并用一个包含 1,000,000 个项目的列表填充它。这很好用,而且速度惊人。

但是,当我将它嵌套在 a 下时,StackPanel它会加载超过一分钟,直到我得到OutOfMemoryException. 我也设置了相同的VirtualizingPanel属性,StackPanel但它没有帮助。

这种行为是故意的还是我在这里遗漏了一些基本的东西?以及如何设法在嵌套控件中支持数据虚拟化?

0 投票
1 回答
1440 浏览

c# - 绑定到 VirtualizingStackPanel 上的数据中断

首先,免责声明,我正在使用 .net 3.5 的 virtualizingstackpanel。如果您在以后的版本中有不同的行为,请告诉我。使用列表视图设置测试用例相对简单,您可以对其进行测试。

我在将属性 IsSelected 绑定到视图模型的 virtualizingstackpanel 中有一个 itemcontainer 样式。

当我在屏幕外的视图模型中选择一个未选择的项目,然后滚动到该项目时,数据上下文(视图模式)和实际的列表视图项都将 IsSelected 属性设置为 true(预期行为)。触发器正确地应用于突出显示它的列表视图项。

但是,当我取消选择不在视图中的项目的数据上下文然后向下滚动直到项目在视图中时,到达项目并创建它时,项目的数据上下文现在具有 IsSelected = true 并且 listviewitem 的 IsSelected 属性也是 true ,因此 listviewitem 以触发器的选择矩形结束(不正​​确的行为)。

就好像 ListViewItem 的属性在创建项目时全部恢复(这对我来说很有意义,但随后它们应该将数据上下文的值绑定到项目)。

但这似乎并没有发生。此外,在未能取消选择该项目并向后滚动以找到它被选中后。如果我然后选择/删除它,则绑定对项目没有影响。

我看不出为什么在视图模型中选择屏幕外的项目时它会起作用,而不是当我取消选择屏幕外的项目时它会起作用。在这两种情况下,新创建的项目都需要重新绑定到视图模型的当前值。但是,一个有效,另一个无效。

编辑:啊,好吧,所以我似乎不能使用回收模式和绑定。谢谢@devhedgehog。会给你赏金,但你需要一个答案。我发誓我早些时候尝试过,但也许我之前没有处理绑定列表视图中的点击事件,所以我打破了物理选择或其他东西的绑定。我确实记得曾经尝试过两种模式,但可能有其他干扰,所以它不起作用。无论如何,它现在有效。

既然你提到它,我想最好避免保留不必要的代码并从 virtualizingstackpanel 继承而不是虚拟化面板。但是我希望能够设置水平滚动范围,这需要我重新实现Iscrollinfo。但是,我无法让 virtualizingstackpanel 与 iscrollinfo 很好地交互。

0 投票
2 回答
150 浏览

xaml - 如何在 WP8 中增加 VirtualizingStackPanel 的范围?

这个问题主要针对 Windows Phone 开发人员,但我想任何 XAML 技术都适用。

我的VirtualizingStackPanel作品很棒,我可以看到内存使用的改进。但是,我在其中的项目ListBox的高度是可变的,并且实例化/绑定可能非常复杂。

当滚动速度非常快时,您会在面板赶上时开始看到死区。在我看来,如果面板能够提前渲染更多项目,则可以解决此问题。

在这一点上,我有一种感觉,它只会在最后一个可见项目之后再渲染 1 或 2 个项目。有没有办法增加这个数字?它可以在前面渲染 5 个项目吗?

如果答案是“不”,有没有办法欺骗/破解它?

0 投票
0 回答
169 浏览

wpf - Type.InvokeMember 有什么用

我在 WPF 应用程序中工作,在一个地方我不得不使用这段代码来获取对 VirtualizingStackPanel 的引用。

以下是一段代码,

有人可以解释一下这条线到底是做什么的,那些绑定标志是什么?

0 投票
4 回答
3026 浏览

wpf - VirtualizingStackPanel 与虚拟化列表

我正在开发一个应用程序,该应用程序应该以类似列表/网格的方式显示从其他地方(例如数据库)加载的大量项目。

由于一直将所有项目都放在内存中似乎是一种浪费,因此我正在研究虚拟化列表的一部分的方法。VirtualizingStackPanel看起来就像我需要的一样 - 但是,虽然它似乎在虚拟化项目的 UI方面做得很好,但我不确定如何虚拟化底层项目列表本身的部分。

作为一个小示例,考虑一个以此作为主窗口的 WPF 应用程序:

提供列表的代码隐藏应如下所示:

因此,这将显示一个带有 的应用程序,该应用程序ListBox被迫使用IsVirtualizing附加的属性虚拟化其项目。它从数据上下文中获取其项目,为此提供了一个自定义IList<T>实现,可以动态创建 10000 个数据项(当它们通过索引器检索时)。

出于调试目的,每当创建项目时都会输出文本ADD #(其中等于项目索引),并且该事件用于在项目离开视图并且其 UI 被虚拟化堆栈面板释放时输出。#CleanUpVirtualizedItemDEL #

现在,我希望我的自定义列表实现根据请求提供项目 - 在这个最小的示例中,通过动态创建它们,在实际项目中通过从数据库加载它们。不幸的是,VirtualizingStackPanel它似乎并没有以这种方式表现 - 相反,它在程序启动时调用列表的枚举器并首先检索所有 10000 个项目!

因此,我的问题是:如何使用 VirtualizingStackPanel 进行数据的实际虚拟化(例如,不加载所有数据),而不仅仅是减少 GUI 元素的数量?

  • 有没有办法告诉虚拟化堆栈面板总共有多少项目,并告诉它根据需要通过索引访问它们,而不是使用枚举器?(例如,如果我没记错的话, Delphi Virtual TreeView 组件可以工作。)
  • 当一个项目实际进入视野时,是否有任何巧妙的方法来捕获事件,所以至少我通常可以只存储每个项目的唯一键,并且只在请求时加载剩余的项目数据?(不过,这似乎是一个 hacky 解决方案,因为除了满足 WPF API 之外,我仍然必须无缘无故地提供完整的列表。)
  • 另一个 WPF 类是否更适合这种虚拟化?

编辑:按照开发刺猬的建议,我创建了一个自定义ICollectionView实现。它的一些方法仍然实现为 throw NotImplementedExceptions,但在打开窗口时调用的方法却没有。

但是,似乎该集合视图调用的第一件事是GetEnumerator方法,再次枚举所有 10000 个元素(正如调试输出所证明的那样,我为每 1000 个项目打印一条消息),这就是我正在尝试的避免。

以下是重现该问题的示例:

Window1.xaml

Window1.xaml.cs

0 投票
1 回答
1060 浏览

c# - Couldn't get selected items correctly if setting ListView ItemsContainer as VirtualizationStackPanel

I set 'VirtualizingStackPanel.IsVirtualizing' to true and 'VirtualizingStackPanel.VirtualizationMode' to 'Recycling', because the items in my ListView are too many. The SelectionMode of the ListView is Extended, the 'IsSelected' property of the ListViewItem is bound to 'IsSelected' property of my model, bind mode is two way.

When I want to use Ctrl+A to select all of the items, it only select part of the items, so I use KeyBinding to write the select all method like below:

SelectAll method will loop the ItemsSource collection and set each of the item's IsSelected property to true. But it also leads to something unexpected. When all of the items are selected, I scroll the scrollbar to the bottom and it will load more items to the ListView, I single click one item and the expected is all other items are unselected, only select this item. But, it seems not unselect other items.

Anybody can help?

0 投票
1 回答
264 浏览

wpf - VirtualizingStackPanel 仅在新鲜时才快速。我该如何解决?

当我ListBox在启用虚拟化的情况下创建然后更新其所有项目外观时,它的工作速度非常快。但是当我慢慢向下滚动所有项目ListBox然后更新所有项目的外观时,它需要很多时间。我认为这是因为VirtualizingStackPanel当它们用完视口时不会破坏它们。我编写了简单的应用程序来重现这种行为。

代码:

XAML:

单击“UpdateText”按钮更新所有文本框文本。如果通过拖动滚动条慢慢滚动到结束,“UpdateText”按钮会出现巨大的延迟。

0 投票
1 回答
7422 浏览

wpf - 提高 StackPanel 中巨大 ListBox 的性能?

我正在使用 StackPanel 垂直布局多个控件(即标题、子标题、列表框、分隔符、列表框等)。

StackPanel 是 ScrollViewer 的子项,以确保其内容始终可滚动。

StackPanel 中的控件之一是 ListBox。

它的ItemsSource是数据绑定到一个庞大的集合中,每个item都是用一个复杂的DataTemplate来实现的。

不幸的是,我的性能真的很差(高 CPU/内存)。

我试过了

  • 将 ListBox 的 ItemsPanel 设置为 VirtualizingStackPanel,以及
  • 将其 ControlTemplate 重写为仅 ItemsPresenter(删除 ListBox 的 ScrollViewer)。

但是在性能上并没有什么不同。我猜 StackPanel 在测量期间给它的内部孩子无限的高度?

当我将 ScrollViewer 和 StackPanel 替换为其他面板/布局(例如,Grid、DockPanel)并且性能显着提高时,这使我相信瓶颈以及解决方案都在虚拟化中。

我有什么办法可以提高这个视图的 cpu/memory 性能吗?

在此处输入图像描述

[更新 1]

原始示例项目:http ://s000.tinyupload.com/index.php?file_id=29810707815310047536

[更新 2]

我尝试重新设计/模板化 TreeView/TreeViewItems 以提出以下示例。仍然需要很长时间才能启动/相同,内存使用率很高。但是一旦加载,滚动感觉比原始示例响应更快。

想知道是否有任何其他方法可以进一步提高启动时间/内存使用率?

重新设计的 TreeView 项目:http ://s000.tinyupload.com/index.php?file_id=00117351345725628185

[更新 2]

pushpraj 的解决方案就像一个魅力

  • 原来的:
    • 启动:35s,
    • 内存:393MB
    • 滚动:慢
  • 树视图:
    • 启动:18s,
    • 内存377MB,
    • 滚动:快速
  • pushpraj 的解决方案:
    • 启动:<1s,
    • 内存:20MB,
    • 滚动:快速