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

本文关键字:书签 文档 Word MS 超链接 | 更新日期: 2023-09-27 17:49:50

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

到目前为止,我有:

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

我假设相对路径是从exe位置。我根本打不开文档

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

对我之前的答案进行补充,有一种编程方式可以打开本地Word文件,搜索书签并将光标放置在那里。我是根据这个精彩的回答改编的。如果你有这样的设计:

<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;
}

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

这里有一个很好的例子

根据官方文档,它应该非常简单:

<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;
  }

然而,在许多非官方页面上有一个共识,那就是这只适用于

  • .doc文件(没有Office 2007 .docx文件),不幸的是
  • 仅适用于Office 2003

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

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