Гиперссылка на закладку в документе MS Word - PullRequest
8 голосов
/ 13 апреля 2011

Можно ли сделать ссылку на закладку в текстовом документе из текстового блока WPF?

Пока у меня есть:

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

Я предполагаю, что относительный путь от exe местоположения. Я вообще не могу открыть документ.

Ответы [ 3 ]

5 голосов
/ 04 мая 2013

В дополнение к моему предыдущему ответу, существует программный способ открытия локального файла 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;
}
4 голосов
/ 13 апреля 2011

Использование гиперссылки в приложении WPF, а не на веб-странице требует от вас обработки события RequestNavigate самостоятельно.

Здесь есть хороший пример .

3 голосов
/ 04 мая 2013

Согласно официальной документации , это должно быть удивительно просто:

<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 файлами приведет к ошибке.Использование этого с .doc файлами в Office 2007 и выше откроет документ, но на первой странице.

Вы можете обойти ограничения Office 2007 и выше, используя AutoOpen макросы, здесь вы узнаете, как передать аргумент макроса в Word.Для этого потребуется изменить все документы, которые будут использоваться с этой системой (и поставить дополнительные вопросы об использовании макросов).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...