2009-04-17 15 views
9

isReadOnlyTrue olarak ayarlanmış bir WPF RichTextBox var. Kullanıcıların, Ctrl Ctrl tuşunu basılı tutmak zorunda kalmadan, RichTextBox içinde bulunan HyperLinks'e tıklayabilmesini isterim.Bir RichTextBox'ta HyperLinks içinde tıklatmadan CTRL - WPF

HyperLink'teki Click olayı, Ctrl tutulduğu sürece tetiklenmiyor, bu yüzden nasıl devam edeceğime emin değilim.

+2

Zaten Skeet'e teşekkür mü? Çok zor! – Anthony

+0

@Anthony, bu bir imzaydı (yazıma bakın) – JaredPar

+1

Hehehe, Ben aslında John, ama Skeet gelirse ona kesinlikle teşekkür edeceğim :) –

cevap

3

Bu şekilde bir yol bulmak için yönetilen, neredeyse kazayla.

RichTextBox'ım içine yüklenen içerik, yalnızca düz bir dizgi olarak depolanır (veya girilir). RichTextBox'ı, Document özelliğine karşı ciltlemeye izin vermek için alt sınıflarım var.

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; 

Bu beni alır: soruya alakalı ne

, ben şuna benzer bir IValueConverter dönüştürme() aşırı (çözümüne kod zaruri olmayan atıldıktan) olması Ben istediğim davranış (RichTextBox'a düz dizeler ekleme ve biçimlendirme alma) ve ayrıca bir Word belgesinde gömülü olan yerine normal bir bağlantı gibi davranan bağlantılarla sonuçlanır.

+0

Var textSplit nerede ve nasıl oluşturuldu? –

+0

Bu cevabın en yüksek değeri olmalı. –

0

Click olayı yerine MouseLeftButtonDown olayını işlemeyi denediniz mi?

17

Bir çözüm buldum. IsDocumentEnabled öğesini "True" olarak ayarlayın ve IsReadOnly değerini "True" olarak ayarlayın. Bunu yapan kez ben HyperLink etiketi içinde görüntülenen bir metin üzerine geldiğinizde

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

, fare bir 'el' e dönüşecekti. Kontrolü tutmadan tıklamak 'Tıklama' olayını tetikler.

WPF'yi .NET 4'ten kullanıyorum. .NET'in önceki sürümlerinin yukarıda açıkladığım gibi çalışıp çalışmadığını bilmiyorum.

+5

bu, metni kopyalama ve yapıştırma amaçlı olarak unvanectable yapmanın olumsuz yan etkisine sahiptir. – Julien

10

JHubbard80 'un yanıtı olası bir çözümdür, seçilecek içeriğe ihtiyacınız yoksa en kolay yoldur.

Ancak buna ihtiyacım var: P işte benim yaklaşımım: 'un içinde Hyperlink s için bir stil ayarlayın. Önemli olan, Hyperlink s MouseLeftButtonDown olayını işlemek için EventSetter kullanmaktır.

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

Ve codebehind içinde

: inspiaration için gcores için

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

teşekkürler.

+0

Elimi alamıyorum, ama her neyse. Çalışır, ve daha da iyisi, köprünün gezinme koduna erişmemi sağlıyor - bir dizin yoksa, uygulamanız çökmez! – Darkhydro

+0

Tıklama olayı benim için çalıştı.Bir Windows 10/WPF 4.5 şey olabilir ama çalıştı. Teşekkürler. –

İlgili konular