C # WPF Текст со ссылками - PullRequest
       51

C # WPF Текст со ссылками

7 голосов
/ 05 августа 2010

Я только что нашел себе новый вызов: Сделайте текстовый процессор, который обрабатывает больше как веб, чем простой текст. Я не могу дождаться, когда начну разрабатывать хороший фреймворк, но мне нужно знать, какие возможности есть у GUI (вероятно, у него будет множество проблем с GUI).

Итак, основное, что мне нужно, это какой-то элемент управления, где я могу сделать части моего текста кликабельными / наведенными на мышь. Я немного новичок в WPF и не знаю, как это сделать. Кто-нибудь знает, как это сделать? Есть ли примеры? Для этого уже есть элементы управления?

Заранее спасибо

EDIT:

Я нашел способ сделать это с помощью richtextbox:

// Create a FlowDocument to contain content for the RichTextBox.
FlowDocument myFlowDoc = new FlowDocument();

// Add paragraphs to the FlowDocument.

Hyperlink myLink = new Hyperlink();
myLink.Inlines.Add("hyperlink");
myLink.NavigateUri = new Uri("http://www.stackoverflow.com");

// Create a paragraph and add the Run and hyperlink to it.
Paragraph myParagraph = new Paragraph();
myParagraph.Inlines.Add("check this link out: ");
myParagraph.Inlines.Add(myLink);
myFlowDoc.Blocks.Add(myParagraph);

// Add initial content to the RichTextBox.
richTextBox1.Document = myFlowDoc;

Теперь я получаю приятную гиперссылку в своем текстовом поле ... кроме тех случаев, когда я нажимаю на нее, ничего не происходит. что мне здесь не хватает?

Ответы [ 3 ]

21 голосов
/ 05 августа 2010

Вы можете использовать класс Hyperlink . Это FrameworkContentElement, так что вы можете использовать его в TextBlock или FlowDocument или в любом другом месте, где вы можете встраивать контент.

<TextBlock>
    <Run>Text</Run>
    <Hyperlink NavigateUri="http://stackoverflow.com">with</Hyperlink>
    <Run>some</Run>
    <Hyperlink NavigateUri="http://google.com">hyperlinks</Hyperlink>
</TextBlock>

Возможно, вы захотите использовать RichTextBox как часть вашего редактора. Это будет размещать FlowDocument, который может содержать контент, такой как гиперссылки.


Обновление: есть два способа обработки кликов по гиперссылке. Одним из них является обработка события RequestNavigate . Это маршрутизируемое событие , поэтому вы можете либо прикрепить обработчик к самой гиперссылке, либо привязать его к элементу выше в дереве, например Window или RichTextBox:

// On a specific Hyperlink
myLink.RequestNavigate +=
    new RequestNavigateEventHandler(RequestNavigateHandler);
// To handle all Hyperlinks in the RichTextBox
richTextBox1.AddHandler(Hyperlink.RequestNavigateEvent,
    new RequestNavigateEventHandler(RequestNavigateHandler));

Другой способ - использовать команду , задав для свойства Command в гиперссылке реализацию ICommand . Метод Executed в ICommand будет вызываться при нажатии на гиперссылку.

Если вы хотите запустить браузер в обработчике, вы можете передать URI в Process.Start :

private void RequestNavigateHandler(object sender, RequestNavigateEventArgs e)
{
    Process.Start(e.Uri.ToString());
}
3 голосов
/ 03 октября 2013

Обратите внимание, что вам также нужно установить следующие свойства на вашем RichTextBox, иначе гиперссылки будут отключены и не будут запускать события.Без IsReadOnly вам нужно нажать Ctrl-клик по гиперссылкам, с IsReadOnly они запускаются обычным щелчком левой кнопки.

<RichTextBox
    IsDocumentEnabled="True"
    IsReadOnly="True">
1 голос
/ 05 августа 2010

Самый простой способ - обработать событие RequestNavigate следующим образом:


...
myLink.RequestNavigate += HandleRequestNavigate;
...

private void HandleRequestNavigate(object sender, RoutedEventArgs e)
{
   var link = (Hyperlink)sender;
   var uri = link.NavigateUri.ToString();
   Process.Start(uri);
   e.Handled = true;
}

Существуют некоторые проблемы с запуском браузера по умолчанию, передавая URL-адрес Process.Start, и вы, возможно, захотите использовать Google для лучшего способа.реализовать обработчик.

...