Нажатие гиперссылок в RichTextBox без удержания нажатой клавиши CTRL - WPF - PullRequest
11 голосов
/ 18 апреля 2009

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

.

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

Ответы [ 5 ]

21 голосов
/ 27 мая 2011

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

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

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

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

12 голосов
/ 24 ноября 2013

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

Однако мне нужно следующее: P вот мой подход: установить стиль для Hyperlink s внутри RichTextBox. Необходимо использовать EventSetter, чтобы Hyperlink s обрабатывал событие 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 за вдохновение.

5 голосов
/ 18 апреля 2009

Удалось найти способ обойти это, почти случайно.

Содержимое, загруженное в мой 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 голосов
/ 01 февраля 2019

Я изменил EventSetter с ответа @ Hillin. MouseLeftButtonDown не работает в моем коде (.Net framework 4.5.2).

<EventSetter Event="RequestNavigate" Handler="Hyperlink_RequestNavigate" />
private void Hyperlink_RequestNavigate(object sender, System.Windows.Navigation.RequestNavigateEventArgs e)
{
    Process.Start(e.Uri.ToString());
}
0 голосов
/ 18 апреля 2009

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

...