2009-04-17 13 views
9

Mam RichTextBox WPF z isReadOnly ustawiona na True. Chciałbym, aby użytkownicy mogli kliknąć na HyperLinks zawarte w RichTextBox, bez konieczności przytrzymywania Ctrl.Klikanie HyperLinks w RichTextBox bez przytrzymywania CTRL - WPF

Zdarzenie Click w HyperLink wydaje się nie uruchamiać, dopóki nie zostanie zatrzymane Ctrl, więc nie jestem pewien, jak postępować.

+2

Już dziękuję Skeetowi? Bardzo trudne! – Anthony

+0

@Anthony, to był podpis (spójrz na pisownię) – JaredPar

+1

Hehehe, jestem w rzeczywistości Johnem, ale jeśli Skeet przejdzie, zdecydowanie mu podziękuję :) –

Odpowiedz

3

Udało się znaleźć sposób obejścia tego, prawie przez przypadek.

Treści załadowane do mojego RichTextBox są zapisywane (lub wprowadzane) jako zwykły ciąg znaków. Podklasowałem RichTextBox, aby umożliwić powiązanie z jego właściwością Document.

Co istotne pytanie, jest to, że mam IValueConverter Convert() przeciążenie, który wygląda mniej więcej tak (kod non-essential do roztworu został uproszczoną 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; 

To dostaje mi się zachowanie, które chcę (wrzucanie zwykłych ciągów znaków do RichTextBox i uzyskiwanie formatowania), a także powoduje, że odsyłacze zachowują się jak normalne łącze, a nie takie, które są osadzone w dokumencie programu Word.

+0

Gdzie i jak utworzono var textSplit? –

+0

Ta odpowiedź powinna mieć najwięcej awansów. –

0

Czy próbowałeś obsługiwać zdarzenia MouseLeftButtonDown zamiast zdarzenia Click?

17

Znalazłem rozwiązanie. Ustaw IsDocumentEnabled na "True" i ustaw IsReadOnly na "True".

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

Kiedyś zrobiłam tego, myszy zamieni się w „ręce”, gdy unoszą się nad tekstem wyświetlanym w tagu hiperłącze. Kliknięcie bez trzymania kontroli spowoduje wyzwolenie zdarzenia "Kliknij".

Używam WPF z .NET 4. Nie wiem, czy wcześniejsze wersje .NET nie działają tak, jak opisałem powyżej.

+5

ma to niezbę dny efekt uboczny polegajĘ ... cy na usunię ciu tekstu z kopiowania i wklejania. – Julien

10

JHubbard80 Odpowiedź jest możliwym rozwiązaniem, jest to najprostszy sposób, jeśli nie trzeba wybierać zawartości.

Jednak potrzebuję tego: P tutaj jest moje podejście: ustaw styl dla Hyperlink s wewnątrz RichTextBox. Niezbędne jest użycie EventSetter do obsługi zdarzeń .

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

A w kodzie:

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

Dzięki gcores dla inspiaration.

+0

Nie dostaję ręki, ale nieważne. Działa, a nawet lepiej, daje mi dostęp do kodu nawigacyjnego hiperłącza - więc jeśli katalog nie istnieje, moja aplikacja się nie zawiesza! – Darkhydro

+0

Obsługa zdarzenia kliknięcia sprawdziła się u mnie.Może to być Windows 10/WPF 4.5, ale zadziałało. Dzięki. –

Powiązane problemy