2009-04-17 7 views
9

J'ai un WPF RichTextBox avec isReadOnly mis à True. Je souhaite que les utilisateurs puissent cliquer sur les liens hypertexte contenus dans le RichTextBox, sans qu'ils aient à appuyer sur Ctrl.Cliquez sur HyperLinks dans un RichTextBox sans maintenir CTRL - WPF

L'événement Click sur l'HyperLink ne semble pas se déclencher sauf si Ctrl est maintenu enfoncé, donc je ne suis pas sûr de la marche à suivre.

+2

Vous avez déjà remercié Skeet? Très difficile! – Anthony

+0

@Anthony, c'était une signature (regardez l'orthographe) – JaredPar

+1

Hehehe, je suis en fait John, mais si Skeet arrive, je vais certainement le remercier :) –

Répondre

3

Géré pour trouver un moyen de contourner cela, à peu près par accident.

Le contenu qui est chargé dans mon RichTextBox est simplement stocké (ou entré) en tant que chaîne simple. J'ai sous-classé le RichTextBox pour autoriser la liaison avec sa propriété Document.

ce qui est pertinent à la question, est que j'ai une surcharge Convertir IValueConverter() qui ressemble à ceci (code non essentiel à la solution a été dépouillé):

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; 

Cela me obtient la comportement que je veux (en introduisant des chaînes de caractères dans RichTextBox et en obtenant un formatage) et il en résulte également des liens qui se comportent comme un lien normal, plutôt qu'un lien qui est incorporé dans un document Word.

+0

Où et comment le var textSplit a-t-il été créé? –

+0

Cette réponse devrait avoir la plupart des upvotes. –

0

Avez-vous essayé de gérer l'événement MouseLeftButtonDown au lieu de l'événement Click?

17

J'ai trouvé une solution. Définissez IsDocumentEnabled sur "True" et définissez IsReadOnly sur "True".

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

Une fois que je l'ai fait, la souris se transformerait en une « main » quand je passe la souris sur un texte affiché dans une balise HyperLink. Cliquer sans tenir le contrôle déclenchera l'événement 'Clic'.

J'utilise WPF à partir de .NET 4. Je ne sais pas si les versions antérieures de .NET ne fonctionnent pas comme je le décris ci-dessus.

+5

cela a l'effet secondaire non voulu de rendre le texte non sélectionnable pour copier et coller. – Julien

10

JHubbard80 La réponse est une solution possible, c'est le moyen le plus simple si vous n'avez pas besoin que le contenu soit sélectionné.

Cependant, j'ai besoin de cela: P voici mon approche: définir un style pour le Hyperlink s à l'intérieur du RichTextBox. L'essentiel est d'utiliser un EventSetter pour que le Hyperlink gère l'événement MouseLeftButtonDown.

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

Et codebehind:

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

Merci à gcores pour le inspiaration.

+0

Je n'ai pas la main, mais peu importe. Cela fonctionne, et même mieux, me donne accès au code de navigation du lien hypertexte - donc si un répertoire n'existe pas, mon application ne plante pas! – Darkhydro

+0

Gérer l'événement click a fonctionné pour moi.Ce pourrait être une chose de Windows 10/WPF 4.5 mais cela a fonctionné. Merci. –

Questions connexes