在Windows应用商店应用中虚拟化非常大的ScrollViewer

时间:2014-07-07 19:39:33

标签: windows-store-apps scrollviewer ui-virtualization

我提前为这篇相当长的帖子道歉。

我正在开发适用于Windows 8.1商店应用的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-offsets-larger-than-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首次弹出(Visibility auto)时,内容会跳跃一点。这可能是可以解决的......

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

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

谢谢, 托马斯

1 个答案:

答案 0 :(得分:0)

我之前和之后都遇到过这个问题,而我从来没有必要修复它(它是原型) - 我认为解决方案可能是将ListViewItemsPanel等列表控件子类化对于VirtualizingStackPanel,请使用平台上的虚拟化面板,例如ItemsStackPanelScrollViewer。我认为这些可能会使用一些技巧来解决2M限制。值得注意的是,IIRC,VSP将{{1}}的偏移量的度量单位从像素更改为其他值(项目?)。 除此之外 - 您可以按照链接的MSDN主题中的建议打开支持请求。