2009-04-17 1 views
9

У меня есть WPF RichTextBox с isReadOnly, установленным на True. Я бы хотел, чтобы пользователи могли нажимать на HyperLinks, содержащиеся в RichTextBox, без необходимости удерживать Ctrl.Щелчок гиперпотоков в RichTextBox без удержания CTRL - WPF

Событие Click на HyperLink, похоже, не срабатывает, если Ctrl удерживается, поэтому я не уверен, как действовать.

+2

Уже благодарим Скита? Очень сложно! – Anthony

+0

@ Энтони, это была подпись (посмотрите на орфографию) – JaredPar

+1

Хехехэ, я на самом деле Джон, но если Скит придет, я обязательно буду ему благодарен :) –

ответ

3

Удалось найти путь вокруг этого, в значительной степени случайно.

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

Что отношение к вопросу, является то, что у меня есть IValueConverter Convert() перегрузки, которая выглядит примерно так (код несущественные для решения зачищенных из):

FlowDocument doc = new FlowDocument(); 
Paragraph graph = new Paragraph(); 

Hyperlink textLink = new Hyperlink(new Run(textSplit)); 
textLink.NavigateUri = new Uri(textSplit); 
textLink.RequestNavigate += 
    new System.Windows.Navigation.RequestNavigateEventHandler(navHandler); 

graph.Inlines.Add(textLink); 
graph.Inlines.Add(new Run(nonLinkStrings)); 

doc.Blocks.Add(graph); 

return doc; 

Это получает меня в поведение, которое я хочу (перетаскивание простых строк в RichTextBox и получение форматирования), а также приводит к ссылкам, которые ведут себя как обычная ссылка, а не одна, встроенная в документ Word.

+0

Где и как был создан var textSplit? –

+0

Этот ответ должен иметь самые высокие показатели. –

0

Вы пытались обработать событие MouseLeftButtonDown вместо события Click?

17

Я нашел решение. Установите IsDocumentEnabled в значение «True» и установите IsReadOnly на «True».

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

После того, как я сделал это, мышь превратится в «руки», когда я наведите курсор мыши на текст отображается в виде гиперссылки тега. Щелчок без контроля приведет к срабатыванию события «Click».

Я использую WPF из .NET 4. Я не знаю, работают ли более ранние версии .NET, как описано выше.

+5

Это имеет непредвиденный побочный эффект, делая текст непригодным для копирования и вставки. – Julien

10

JHubbard80 ответ является возможным решением, это самый простой способ, если вам не нужен выбранный контент.

Однако мне это нужно: P вот мой подход: установите стиль для Hyperlink s внутри RichTextBox. Существенным является использование EventSetter, чтобы сделать Hyperlink с обработкой события MouseLeftButtonDown.

<RichTextBox> 
    <RichTextBox.Resources> 
     <Style TargetType="Hyperlink"> 
      <Setter Property="Cursor" Value="Hand" /> 
      <EventSetter Event="MouseLeftButtonDown" Handler="Hyperlink_MouseLeftButtonDown" /> 
     </Style> 
    </RichTextBox.Resources> 
</RichTextBox> 

А в коде:

private void Hyperlink_MouseLeftButtonDown(object sender, MouseEventArgs e) 
{ 
    var hyperlink = (Hyperlink)sender; 
    Process.Start(hyperlink.NavigateUri.ToString()); 
} 

Благодаря gcores для inspiaration.

+0

Я не получаю руку, но что угодно. Он работает, и даже лучше, дает мне доступ к навигационному коду гиперссылки - поэтому, если каталог не существует, мое приложение не сбой! – Darkhydro

+0

Работа с событием click работала для меня.Это может быть Windows 10/WPF 4.5, но это сработало. Благодарю. –

Смежные вопросы