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

时间:2015-04-08 15:11:51

标签: c# wpf xaml documentviewer

在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页)。

1 个答案:

答案 0 :(得分:2)

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

从原始帖子中可以看出,我使用了Frame,其内容设置为DocumentViewerFrame用于在XPS文档中启用导航。

一些细节:

首次加载文档时,Content的实际Frame设置为DocumentViewerSource的{​​{1}}为Frame。单击文档中的链接时,null会导航到该位置,但准确性较差,如上面的问题所述。在幕后,Frame已将其Frame更改为Content的实例,其FixedDocumentSequence设置为点击的Source。从现在开始,导航工作完全准确。

解决方案:

解决方案实际上非常简单。而不是将Uri置于DocumentViewer内并将Frame属性设置为实际DocumentViewer.DocumentFixedDocumentSequence属性应设置为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>