2010-08-05 3 views
3

Я только что нашел себе новую задачу: Сделайте текстовый процессор, который обрабатывает больше, чем в Интернете, чем обычный текст. Проектирование хорошей структуры для этого - это то, чего я не могу ждать, прежде чем начать, но мне нужно знать, какие возможности есть у GUI (у него, вероятно, будет много проблем с GUI).C# WPF Текст со ссылками

Итак, основная вещь, в которой мне нужен какой-то элемент управления, где я могу сделать части своего текста доступными для мыши/мышью.

Я новичок в 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; 

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

ответ

16

Вы можете использовать класс 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. Это Routed Event, так что вы можете либо присоединить обработчик гиперссылке себя или вы можете прикрепить один к элементу выше в дереве, такие как окна или RichTextBox:

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

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

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

private void RequestNavigateHandler(object sender, RequestNavigateEventArgs e) 
{ 
    Process.Start(e.Uri.ToString()); 
} 
+0

проверить мое редактирование через 5 минут, спасибо! – SirLenz0rlot

+0

это должно сделать трюк, спасибо большое! – SirLenz0rlot

1

Самый простой способ справиться с 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 для лучшего способа реализации обработчика.

3

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

<RichTextBox 
    IsDocumentEnabled="True" 
    IsReadOnly="True">