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
,其内容设置为DocumentViewer
。 Frame
用于在XPS文档中启用导航。
一些细节:
当文档第一次加载时, Frame
的实际Content
将设置为DocumentViewer
。 Frame
的Source
为null
。 单击文档中的链接时, Frame
导航到该位置,但准确性较差,如上面的问题所述。 在幕后, Frame
已将其Content
更改为FixedDocumentSequence
的实例,并将其Source
设置为单击的Uri
。 从现在开始,导航工作完全准确。
解决方案:
解决方案实际上非常简单。 而不是将DocumentViewer
放在Frame
并将DocumentViewer.Document
属性设置为实际的FixedDocumentSequence
, Frame.Source
应将Frame.Source
属性设置为FixedDocumentSequence
的Uri
。
FixedDocumentSequence
实现可用于检索Uri
的显式接口属性IUriContext.BaseUri
。
在我的代码中,我使用绑定来设置源代码:
在后面的代码中,你可以通过这样做完成同样的事情:
XpsDocument xpsDoc = new XpsDocument(Path, FileAccess.Read); FixedDocumentSequence document = xpsDoc.GetFixedDocumentSequence(); frame.Source = ((System.Windows.Markup.IUriContext)document).BaseUri;