C# WPF Текст со ссылками
Я только что нашел себе новую задачу: создать текстовый процессор, который будет работать больше как веб, чем обычный текст. Я не могу дождаться, когда начну разрабатывать хороший фреймворк, но мне нужно знать, каковы возможности на стороне GUI (вероятно, у него будет множество проблем с GUI).
Итак, основная вещь, в которой мне нужен какой-то элемент управления, где я могу сделать части моего текста кликабельными / наведенными мышью.
Я немного новичок в WPF и не знаю, как это сделать. Кто-нибудь знает, как это сделать? Есть ли примеры? Есть ли уже элементы управления для этого?
заранее спасибо
РЕДАКТИРОВАТЬ:
Я нашел какой-то способ сделать это с помощью 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.stackru.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 ответа
Вы можете использовать класс Hyperlink. Это FrameworkContentElement, так что вы можете использовать его в TextBlock или FlowDocument или в любом другом месте, где вы можете встраивать контент.
<TextBlock>
<Run>Text</Run>
<Hyperlink NavigateUri="http://stackru.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());
}
Обратите внимание, что вам также нужно установить следующие свойства в вашем RichTextBox, иначе гиперссылки будут отключены и не будут запускать события. Без IsReadOnly вам нужно кликнуть по гиперссылке, удерживая нажатой клавишу Ctrl, с IsReadOnly они запускаются обычным щелчком левой кнопки мыши.
<RichTextBox
IsDocumentEnabled="True"
IsReadOnly="True">
Самый простой способ - обработать событие 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 лучший способ реализовать обработчик.