WPF DocumentViewer:首次点击时使用内部链接导航不准确

在WPF中,我在Frame控件中有一个DocumentViewer。 DocumentViewer显示使用MS Word生成的XPS文档。 该文档包含一个内容表,以帮助浏览文档。

只要DocumentViewer放置在允许导航的控件(例如框架)中,DocumentViewer就允许用户单击这些链接并导航到相应的页面。

当用户第一次导航时,DocumentViewer不会准确地跳转到链接的位置。 文档越远,跳跃位置和实际位置之间的空间就越大。 看起来每页都有一定数量的关闭。 在第一次链接点击后,导航工作完全正常。

使用框架上的导航按钮导航回来时,只要加载第一个视图,链接精度就会再次出现。

根据这篇文章,第一次点击链接后正在创建一个新的DocumentViewer。 似乎这创建了一个按预期工作的实例。

为什么初始实例没有准确导航以及如何解决这个问题?

下面剪切的代码可用于重现该问题。

窗口内的XAML:

     

代码背后:

  public MainWindow() { InitializeComponent(); LoadDoc(); } private void LoadDoc() { XpsDocument xpsDoc = new XpsDocument("test.xps", FileAccess.Read); docViewer.Document = xpsDoc.GetFixedDocumentSequence(); } 

test.xps文档包含一个TOC和两章,它们之间有大约40页。 导航到第二章时,问题变得清晰(它是3页关闭)。

差不多两年后,我重新审视了这个问题并找到了解决方案。

从我原来的post中可以看出,我使用了一个Frame ,其内容设置为DocumentViewerFrame用于在XPS文档中启用导航。

一些细节:

当文档第一次加载时, Frame的实际Content将设置为DocumentViewerFrameSourcenull 。 单击文档中的链接时, Frame导航到该位置,但准确性较差,如上面的问题所述。 在幕后, Frame已将其Content更改为FixedDocumentSequence的实例,并将其Source设置为单击的Uri 。 从现在开始,导航工作完全准确。

解决方案:

解决方案实际上非常简单。 而不是将DocumentViewer放在Frame并将DocumentViewer.Document属性设置为实际的FixedDocumentSequenceFrame.Source应将Frame.Source属性设置为FixedDocumentSequenceUri

FixedDocumentSequence实现可用于检索Uri的显式接口属性IUriContext.BaseUri

在我的代码中,我使用绑定来设置源代码:

      

在后面的代码中,你可以通过这样做完成同样的事情:

 XpsDocument xpsDoc = new XpsDocument(Path, FileAccess.Read); FixedDocumentSequence document = xpsDoc.GetFixedDocumentSequence(); frame.Source = ((System.Windows.Markup.IUriContext)document).BaseUri;