超链接到MS Word文档中的书签

时间:2011-04-13 09:04:51

标签: c# wpf hyperlink ms-word bookmarks

是否可以从WPF文本块链接到word文档中的书签?

到目前为止,我有:

<TextBlock TextWrapping="Wrap" FontFamily="Courier New">
    <Hyperlink NavigateUri="..\\..\\..\\MyDoc.doc"> My Word Document </Hyperlink>
</TextBlock>

我假设相对路径来自exe位置。我根本无法打开文件。

3 个答案:

答案 0 :(得分:5)

作为我之前回答的补充,有一种编程方式可以打开本地Word文件,搜索书签并将光标放在那里。我从this excellent answer改编了它。如果你有这个设计:

<TextBlock>           
    <Hyperlink NavigateUri="..\\..\\MyDoc.doc#BookmarkName"
               RequestNavigate="Hyperlink_RequestNavigate">
        Open the Word file
    </Hyperlink>            
</TextBlock>

使用此代码:

//Be sure to add this reference:
//Project>Add Reference>.NET tab>Microsoft.Office.Interop.Word

private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e) {
    // split the given URI on the hash sign
    string[] arguments = e.Uri.AbsoluteUri.Split('#');

    //open Word App
    Microsoft.Office.Interop.Word.Application msWord = new Microsoft.Office.Interop.Word.Application();

    //make it visible or it'll stay running in the background
    msWord.Visible = true;

    //open the document 
    Microsoft.Office.Interop.Word.Document wordDoc = msWord.Documents.Open(arguments[0]);

    //find the bookmark
    string bookmarkName = arguments[1];

    if (wordDoc.Bookmarks.Exists(bookmarkName))
    {
        Microsoft.Office.Interop.Word.Bookmark bk = wordDoc.Bookmarks[bookmarkName];

        //set the document's range to immediately after the bookmark.
        Microsoft.Office.Interop.Word.Range rng = wordDoc.Range(bk.Range.End, bk.Range.End);

        // place the cursor there
        rng.Select();
    }
    e.Handled = true;
}

答案 1 :(得分:4)

在WPF应用程序而不是网页上使用超链接需要您自己处理RequestNavigate事件。

有一个很好的例子here

答案 2 :(得分:3)

根据official documentation,它应该非常简单:

<TextBlock>           
<Hyperlink NavigateUri="..\\..\\MyDoc.doc#BookmarkName"
    RequestNavigate=”Hyperlink_RequestNavigate”>
    Open the Word file
</Hyperlink>            
</TextBlock>

private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e)
  {
            Process.Start(new ProcessStartInfo(e.Uri.AbsoluteUri));
            e.Handled = true;
  }

但是,a lot of inofficial页面已达成共识,这只能起作用

  • 包含.doc个文件(没有Office 2007 .docx文件),不幸的是
  • 仅限Office 2003

尝试将此文件与.docx文件一起使用会产生错误。在Office 2007及更高版本上使用此.doc文件将打开文档,但在第一页上。

您可以使用AutoOpen宏来解决Office 2007及更高版本的限制,请参阅此处了解如何pass a Macro argument到Word。这将需要更改与该系统一起使用的所有文档(并提出有关使用宏的其他问题)。