在WPF中,我在Frame控件中有一个DocumentViewer。 DocumentViewer显示使用MS Word生成的XPS文档。该文档包含一个内容表,以帮助浏览文档。
只要将DocumentViewer放置在允许导航的控件(例如Frame)中,DocumentViewer就允许用户单击这些链接并导航到相应的页面。
当用户第一次导航时,DocumentViewer无法准确跳转到链接位置。文档越远,跳跃位置和实际位置之间的空间就越大。看起来每页都有一定量的关闭。在第一次链接点击后,导航工作完全正常。
使用框架上的导航按钮导航回来时,只要加载第一个视图,链接精度就会再次出现。
根据this帖子,首次点击链接后正在创建一个新的DocumentViewer。似乎这会创建一个按预期工作的实例。
为什么初始实例没有准确导航以及如何解决这个问题?
下面剪切的代码可用于重现此问题。
窗口内的XAML:
<Frame>
<Frame.Content>
<DocumentViewer Name="docViewer" />
</Frame.Content>
</Frame>
代码背后:
public MainWindow()
{
InitializeComponent();
LoadDoc();
}
private void LoadDoc()
{
XpsDocument xpsDoc = new XpsDocument("test.xps", FileAccess.Read);
docViewer.Document = xpsDoc.GetFixedDocumentSequence();
}
test.xps文档包含一个TOC和两章,它们之间有大约40页。导航到第二章时,问题就变得清晰了(它已经关闭了3页)。
答案 0 :(得分:2)
差不多两年后,我重新审视了这个问题并找到了解决方案。
从原始帖子中可以看出,我使用了Frame
,其内容设置为DocumentViewer
。 Frame
用于在XPS文档中启用导航。
一些细节:
首次加载文档时,Content
的实际Frame
设置为DocumentViewer
。 Source
的{{1}}为Frame
。单击文档中的链接时,null
会导航到该位置,但准确性较差,如上面的问题所述。在幕后,Frame
已将其Frame
更改为Content
的实例,其FixedDocumentSequence
设置为点击的Source
。从现在开始,导航工作完全准确。
解决方案:
解决方案实际上非常简单。而不是将Uri
置于DocumentViewer
内并将Frame
属性设置为实际DocumentViewer.Document
,FixedDocumentSequence
属性应设置为Frame.Source
} Uri
。
FixedDocumentSequence
实现了可用于检索FixedDocumentSequence
的显式接口属性IUriContext.BaseUri
。
在我的代码中,我使用绑定来设置源:
Uri
在代码背后,你可以通过这样做完成同样的事情:
<UserControl x:Class="XPSDocumentView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:base="clr-namespace:System.Windows.Markup;assembly=System.Xaml" >
<Grid>
<Frame Margin="5" NavigationUIVisibility="Hidden"
Source="{Binding Path=Document.(base:IUriContext.BaseUri)}" />
</Grid>
</UserControl>