Windows store apps 在Windows应用商店应用程序中虚拟化超大ScrollViewer

Windows store apps 在Windows应用商店应用程序中虚拟化超大ScrollViewer,windows-store-apps,scrollviewer,ui-virtualization,Windows Store Apps,Scrollviewer,Ui Virtualization,我为这篇相当长的文章提前表示歉意 我正在为Windows 8.1应用商店应用开发PDF查看器。查看器在ScrollViewer中显示PDF页面。我们在使用大型文档时遇到了一个相当大的障碍,结果是ScrollViewer在某个垂直偏移量以下不会显示任何内容。这里有一个msdn线程: 基本上,如果一个文档有大约1000页,那么偏移量2096700以下的内容就会被切断。(我们确实提供了带有FlipView的单页查看模式,但这是用户的选择,而不是问题的解决方案) 正如您在线程中看到的,建议虚拟化Scr

我为这篇相当长的文章提前表示歉意

我正在为Windows 8.1应用商店应用开发PDF查看器。查看器在ScrollViewer中显示PDF页面。我们在使用大型文档时遇到了一个相当大的障碍,结果是ScrollViewer在某个垂直偏移量以下不会显示任何内容。这里有一个msdn线程:

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

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

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

另一方面,这是我们最初为Windows8.0构建它的方式,并且在那里运行良好。Windows 8.1引擎盖下的管道系统改变了这一点

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

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

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

我还考虑将ScrollViewer的内容保留为空,而将我自己的内容放在下面(z级别),我可以使用RenderTransformation来匹配ScrollViewer的内容。我甚至用彩色矩形做了一个小实验,发现了一些问题,这让我觉得很难做到。看起来,当你放大时滚动条第一次弹出(可见性自动)时,内容会有一点跳跃。这也许是可以解决的

我想也有可能从零开始发展我自己的控制。。。可能基于类似PanView()的内容 然而,我担心操作感觉不对劲(物理工作方式与常规ScrollViewer不同)。此外,操作代码将在UI线程上执行,这可能会导致一些延迟,因为它已经是一个相当繁重的控件

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

谢谢,
Tomas

我以前遇到过这个问题,虽然我从来没有解决过(它是一个原型)-我认为解决方案可能是将列表控件子类化,如
ListView
,并为其
ItemsPanel
使用平台上的虚拟化面板,如
VirtualizangStackPanel
ItemsStackPanel
。我认为这些可能会使用一些技巧来绕过2M限制。这里值得注意的是,IIRC VSP将
ScrollViewer
的偏移量的度量单位从像素更改为其他(项目?)。
除此之外,您还可以按照链接的MSDN线程中的建议打开支持请求。

支持请求已起草并准备就绪。也许是可行的,但是虚拟化StackPanel似乎很难使用,因为用户可以在2D中滚动,并且我们在屏幕上放置的东西是小正方形(除了边缘,它们可能是矩形)。所以我们可能会得到一个非常大的二维结构。另一个问题是,控件还有较大的、页面大小的矩形(如果可用),其中包含页面的低分辨率缩略图,这样用户在呈现内容时可以看到一些东西。很难将这两件事合并成VSP。我不知道你在说什么。您可以使用数据虚拟化来避免构建大型结构。您可以使用(虚拟化的)列表,除非您的页面确实需要在2D中滚动。不断地问新问题,你遇到了实现你需要的障碍。你找到解决办法了吗?