对于这篇相当长的帖子,我提前道歉。
我正在为 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 线程上执行,这可能会导致一些延迟,因为它已经是一个相当繁重的控制。
还有其他建议或想法吗?我意识到这可能不是一个常见的问题。
谢谢,托马斯