问题标签 [ui-virtualization]

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 回答
138 浏览

windows-store-apps - Windows 商店应用程序在 ScrollViewer 中自定义模板,而不会破坏 UI 虚拟化

我正在开发一个 Windows 商店 Metro 风格的应用程序,并且在列表页面上实现了无限滚动的 GridView。

它一直有效,直到用户导航“返回”到具有大量记录的列表页面。例如,他们以前滚动到第 100 页。

我目前有这样的代码

根据这篇文章,上面的代码将禁用 UI 虚拟化

如果我将其更改为以下内容,它可以工作,但我丢失了列表开头的填充。

基本上我想在列表开始之前显示一些东西,它需要是可滚动视口的一部分,所以它可以被滚动掉。

0 投票
1 回答
677 浏览

wpf - DataGrid WPF 虚拟化和命令 CanExecute

我正在使用框架 .NET 4.0 开发 WPF 应用程序

我对 DataGrid 有疑问:每行都有 2 个命令:

并且 MoveDown 也有相同的命令(可以执行检查该行是否不是最后一行)

和 DataGrid :

如果我使用 EnableRowVirtualization 将我的网格虚拟化为 true,我会遇到一些麻烦,如果我滚动到底部(第一行不再可见)然后滚动回顶部,有时第一行的按钮向上移动(通常不能向上移动) 是启用的,直到我单击 DataGrid,并且第二个或第三个是禁用的,应该启用!

如果我将 EnableRowVirtualization 设置为 false,我就没有这个问题...

我只在互联网上找到另一篇谈论这个问题的帖子,但没有来自 .net 框架的 dataGrid:http: //www.infragistics.com/community/forums/t/15189.aspx

你知道我该如何解决吗?

先感谢您

编辑:命令类

0 投票
3 回答
1850 浏览

c# - 如何可靠地检测项目何时滚动到视图之外?

我有大量绑定到 a 的项目集合ListBox,其中一个VirtualizingStackPanel集合作为它的ItemsPanel. 随着用户滚动和项目容器的创建,我做了一些工作来用数据填充项目(使用数据库查询)。如果用户滚动速度非常快,它会产生大量请求,从而使事情陷入困境。我想做的是检测项目何时滚动到视口之外,因此我可以取消其相应的请求。

以下是我迄今为止尝试过的方法,以及为什么它们没有奏效:

  1. 覆盖VirtualizingStackPanel.OnCleanUpVirtualizedItem。问题是这个方法的调用似乎比项目实际离开屏幕的时间晚得多。在这种方法中取消我的请求并没有多大好处,因为它发生得太晚了。

  2. 使用 开启容器回收 VirtualizationMode.Recycling。此事件导致项目容器DataContext发生更改,但项目容器本身被重用。DataContextChanged当一个项目超出视野时,该事件立即发生,因此在这方面很好。问题是容器回收会产生很多副作用,并且在我的测试中,总体上有点错误。我宁愿不使用它。

是否有一个好的低级方法,例如挂钩布局事件,可以给我一个关于项目何时超出视图的确定性答案?也许在ScrollViewer水平上?

0 投票
0 回答
76 浏览

wpf - 在 UI 虚拟化中重用 UI 组件的通知

我正在使用带有水平和垂直滚动条的 UI 虚拟化的 Xceed WPF 网格。当我使用可重复使用的 UI 组件 (VirtualizingStackPanel.VirtualizationMode="Recycling") 垂直或水平使用滚动条时,我想要一个事件或属性更改,而不是滚动条。

0 投票
1 回答
1102 浏览

c# - VirtualizingStackPanel 拒绝虚拟化

我编写了一个实现虚拟化的自定义面板。当放置在 ListBox 中时,一切正常。

但是,如果我删除我的面板并使用默认的 VirtualizingStackPanel,在重新模板化以支持虚拟化的 ListBox 或 ItemsControl 中,控件不会虚拟化。

虚拟化确实有效的示例:

虚拟化不起作用的示例:

控件直接放置在 Window 内。为什么 VirtualizingStackPanel 不起作用?

0 投票
1 回答
182 浏览

c# - 具有数据虚拟化的 ListView 中的 WPF 定向导航

根据这篇文章,我已经在 WPF 中使用 ListBox 实现了数据和 UI 虚拟化。简而言之,我将 ListView 绑定到一个集合,该集合会在需要时一次自动加载页面数据。如果 ListView 请求页面上尚未加载的项目,则集合将返回 null,异步加载页面,然后发出 Reset NotifyCollectionChanged 事件,以便 ListView 将获取实际值。

当我尝试使用方向键浏览列表时,这可以正常工作,直到我点击 ListView 第一次获得焦点时未加载的项目。此时,ListView 本身成为焦点。如果我确保通过滚动列表开始加载所有数据(从而强制显示所有项目并因此加载),则定向导航正常工作。

看起来 ListView 以某种方式记住了最初为空的数据并拒绝将焦点移到这些项目上。这里发生了什么?我怎样才能解决这个问题?

0 投票
1 回答
542 浏览

gridview - 在 Win 8.1 Gridview 中使用 Grouping 启用虚拟化

我一直在尝试减少包含此网格视图的页面的加载时间,根据 MS 文档http://msdn.microsoft.com/en-US/library/windows/apps/xaml/hh780657.aspx,您不会如果您使用分组,则获得虚拟化。有谁知道该怎么做?

0 投票
1 回答
328 浏览

windows-store-apps - 在 Windows 应用商店应用中虚拟化非常大的 ScrollViewer

对于这篇相当长的帖子,我提前道歉。

我正在为 Windows 8.1 Store 应用程序开发 PDF 查看器。查看器在 ScrollViewer 中显示 PDF 页面。对于大型文档,我们遇到了一个相当大的障碍,事实证明 ScrollViewer 不会显示低于某个 VerticalOffset 的任何内容。这里有一个关于它的 msdn 线程:http: //social.msdn.microsoft.com/Forums/windowsapps/en-US/f0b2b401-57ec-4cf0-9092-8bed5194f62b/scrollviewer-does-not-render-content-at-偏移量大于 2096700?forum=winappswithcsharp#4eb5d5c1-3887-4e3c-af03-96c0f6a8a7b2

基本上,如果一个文档有大约 1000 页左右,那么偏移量 2096700 以下的内容就会被截断。(我们确实提供了带有 FlipView 的单页视图模式,但这是用户的一个选项,而不是问题的解决方案)。

正如您在线程中看到的,建议是虚拟化 ScrollViewer。

就我而言,我们已经在虚拟化它。ScrollViewer 包含一个 Canvas,其大小计算为包含文档的每一页,但它是完全透明的。相反,当用户滚动时,只会渲染视口当前所在的内容,以及周围的一些内容(为了便于平滑滚动)。距离 ViewPort 太远的内容将被删除。

附带说明一下,这就是我们最初为 Windows 8.0 构建它的方式,并且在那里运行良好。Windows 8.1 引擎盖下的管道改变了这一点。

我一直在思考如何解决这个问题,并想出了一些可能的解决方案。但是,我不相信它们是最好的。所以我想问问其他人他们建议我做什么。

我想到的解决方案之一是缩小 ScrollViewer 的内容,使其永远不会大于 1000000。然后,当用户接近底部时,我可以向上移动到上半部分并将所有内容添加到比实际应该更远的位置(基本上,从偏移量中减去 500000)。随着放大和缩小,这可能有点棘手。现在的另一个问题当然是 ScrollBars。我想我必须以某种方式添加我自己的 ScrollBars 并使 ScrollViewer 的两个滚动条不可见。这可行吗?

除此之外,我想不出任何其他可以被视为虚拟化的东西。也许你们中的一些人知道如何解决这样的问题,或者你可以告诉我我的上述建议很疯狂......

我还考虑将 ScrollViewer 的内容留空,而是在下方(z 水平方向)有我自己的内容,我可以使用 RenderTransformations 移动以匹配 ScrollViewer 的内容。我什至用彩色矩形做了一个小实验,发现了一些让我觉得很难做到的问题。似乎当您放大时第一次弹出 ScrollBar(可见性自动)时,内容会跳动一点。虽然这可能是可以解决的......

我想也可以从头开始开发我自己的控件...也许基于 PanView (http://code.msdn.microsoft.com/windowsapps/PanView-A-Metro-Panning-dc8f28c3)之类的东西我是但是担心操作会感觉不对(物理工作与常规 ScrollViewer 不同)。此外,操作代码将在 UI 线程上执行,这可能会导致一些延迟,因为它已经是一个相当繁重的控制。

还有其他建议或想法吗?我意识到这可能不是一个常见的问题。

谢谢,托马斯

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,
    • 滚动:快速
0 投票
3 回答
775 浏览

c# - WinRT 中 ViewModel 层的虚拟化

WPF 和 WinRT (C# + XAML) 都支持 UI 虚拟化,使用支持它的面板VirtualizingStackPanel和其他面板。使用 MVVM 时,它是使用某种绑定到视图模型上的可枚举属性(通常是 ObservableCollection)ItemsControl的某种(ListBox、等...)来完成的。GridViewitems 控件仅为可见的项目创建 UI。之所以称为 UI 虚拟化,是因为只有 UI 是虚拟化的。只有未呈现的项目的视图不会被创建,并且会延迟到用户实际滚动到项目的那一刻。列表中的视图模型对象都是预先创建的。因此,如果我有一个包含 100,000 人的列表,那么ObservableCollection无论用户何时将它们滚动到视图中,都必须包含 100,000 个视图模型。

在我们的应用程序中,我们希望实现它,以便视图模型层是这种虚拟化的一部分。我们希望 items 控件呈现一个适合可能加载的项目总数的滚动条(因此 observable 集合应该使 items 控件认为它已经包含 100,000 个项目,因此滚动条视图端口位于合适的大小),但我们希望在新项目即将进入视野时通知可观察集合,以便它可以从服务器加载实际对象。我们希望能够在加载的项目中显示某种进度指示器,然后在项目加载到可观察集合后立即将其替换为项目的实际数据模板。

我们希望尽可能地保持 MVVM 指南,但性能和响应能力是优先考虑的因素。如果可能的话,我们也更喜欢可重复使用的解决方案。

解决这个问题的最佳方法是什么?