Clicking HyperLinks in a RichTextBox without holding down CTRL - WPF
I found a solution. Set IsDocumentEnabled to "True" and set IsReadOnly to "True".
<RichTextBox IsReadOnly="True" IsDocumentEnabled="True" />
Once I did this, the mouse would turn into a 'hand' when I hover over a text displayed within a HyperLink tag. Clicking without holding control will fire the 'Click' event.
I am using WPF from .NET 4. I do not know if earlier versions of .NET do not function as I describe above.
JHubbard80's answer is a possible solution, it's the easiest way if you do not need the content to be selected.
However I need that :P here is my approach: set a style for the Hyperlink
s inside the RichTextBox
. The essential is to use a EventSetter
to make the Hyperlink
s handling the MouseLeftButtonDown
event.
<RichTextBox> <RichTextBox.Resources> <Style TargetType="Hyperlink"> <Setter Property="Cursor" Value="Hand" /> <EventSetter Event="MouseLeftButtonDown" Handler="Hyperlink_MouseLeftButtonDown" /> </Style> </RichTextBox.Resources></RichTextBox>
And in codebehind:
private void Hyperlink_MouseLeftButtonDown(object sender, MouseEventArgs e){ var hyperlink = (Hyperlink)sender; Process.Start(hyperlink.NavigateUri.ToString());}
Thanks to gcores for the inspiaration.
Managed to find a way around this, pretty much by accident.
The content that's loaded into my RichTextBox is just stored (or inputted) as a plain string. I have subclassed the RichTextBox to allow binding against it's Document property.
What's relevant to the question, is that I have an IValueConverter Convert() overload that looks something like this (code non-essential to the solution has been stripped out):
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;
This gets me the behavior I want (shoving plain strings into RichTextBox and getting formatting) and it also results in links that behave like a normal link, rather than one that's embedded in a Word document.