Щелчок по гиперссылкам в RichTextBox без удерживания нажатой клавиши CTRL - WPF

StackOverflow https://stackoverflow.com/questions/762271

Вопрос

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

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

Это было полезно?

Решение 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.

Другие советы

Я нашел решение.Установите IsDocumentEnabled равным "True" и установите IsReadOnly равным "True".

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

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

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

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

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

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

И в codebehind:

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

Благодаря корешки для вдохновения.

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

Я изменил EventSetter из ответа @hillin.Мышиная пуговица Вниз не сработало в моем коде (.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());
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top