2009-04-17 11 views
9

Ich habe eine WPF RichTextBox mit isReadOnly auf True festgelegt. Ich möchte, dass Benutzer Hyperlinks innerhalb der RichTextBox anklicken können, ohne dass sie Ctrl gedrückt halten müssen.Klicken Sie auf HyperLinks in einer RichTextBox ohne STRG - WPF

Das Click-Ereignis auf dem HyperLink scheint nicht zu blinken, es sei denn, Ctrl ist gedrückt, so dass ich nicht sicher bin, wie es weiter geht.

+2

Schon Dank Skeet? Sehr trickreich! – Anthony

+0

@Anthony, es war eine Unterschrift (schau auf die Rechtschreibung) – JaredPar

+1

Hehehe, ich bin in der Tat John, aber wenn Skeet kommt durch, werde ich definitiv ihm danken :) –

Antwort

3

Verwaltet um einen Weg herum zu finden, ziemlich zufällig.

Der Inhalt, der in meine RichTextBox geladen wird, wird nur als einfache Zeichenfolge gespeichert (oder eingegeben). Ich habe die RichTextBox subclassiert, um die Bindung an ihre Document-Eigenschaft zuzulassen.

Was die Frage relevant ist, ist, dass ich eine IValueConverter Convert() Überlastung haben, die etwa wie folgt aussieht (Code nicht wesentlich für die Lösung wurde gezupft):

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; 

Dies wird mir die Verhalten, das ich möchte (einfaches Verschieben von Strings in RichTextBox und Formatieren), und es führt auch zu Links, die sich wie normale Links verhalten und nicht zu denen, die in ein Word-Dokument eingebettet sind.

+0

Wo und wie wurde die var textSplit erstellt? –

+0

Diese Antwort sollte die meisten Upvotes haben. –

0

Haben Sie versucht, das MouseLeftButtonDown-Ereignis anstelle des Click-Ereignisses zu behandeln?

17

Ich fand eine Lösung. Setzen Sie IsDocumentEnabled auf "True" und setzen Sie IsReadOnly auf "True".

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

Sobald ich dies tat, schalten die Maus würde in eine ‚Hand‘, wenn ich über einen Text innerhalb eines HyperLink-Tag angezeigt schweben. Wenn Sie auf klicken, ohne die Steuerung zu halten, wird das Ereignis "Click" ausgelöst.

Ich verwende WPF von .NET 4. Ich weiß nicht, ob frühere Versionen von .NET nicht funktionieren, wie ich oben beschrieben habe.

+5

Dies hat den unwahrscheinlichen Nebeneffekt, dass der Text für Kopier- und Einfügezwecke nicht ausgewählt werden kann. – Julien

10

JHubbard80 Die Antwort ist eine mögliche Lösung, es ist der einfachste Weg, wenn Sie den Inhalt nicht benötigen, um ausgewählt zu werden.

Allerdings brauche ich das: P hier ist mein Ansatz: Legen Sie einen Stil für die Hyperlink s innerhalb der RichTextBox. Das Wesentliche ist, ein EventSetter zu verwenden, um das Hyperlink s handhabend das Ereignis MouseLeftButtonDown zu bilden.

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

Und in Code-Behind:

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

Dank gcores für die inspiaration.

+0

Ich bekomme die Hand nicht, aber was auch immer. Es funktioniert, und noch besser, gibt mir Zugriff auf den Navigationscode des Hyperlinks - wenn also kein Verzeichnis existiert, stürzt meine App nicht ab! – Darkhydro

+0

Die Handhabung des Klickereignisses funktionierte für mich.Es könnte ein Windows 10/WPF 4.5 Ding sein, aber es hat funktioniert. Vielen Dank. –

Verwandte Themen