Щелчок по гиперссылкам в RichTextBox без удерживания нажатой клавиши CTRL - WPF
-
11-09-2019 - |
Вопрос
У меня есть 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
чтобы сделать Hyperlink
s обращение с 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());
}