2009-04-17 15 views
9

isReadOnlyを設定したWPF RichTextBoxをTrueに設定しました。 RichTextBoxに含まれているHyperLinksをクリックすることができるようにユーザーにお願いします。Ctrlを押さなくてもいいです。CTRL-WPFを押さずにRichTextBoxでハイパーリンクをクリック

Ctrlが押されていない限り、HyperLinkのClickイベントが発生しないようですので、進める方法がわかりません。

+2

すでにSkeetに感謝していますか?非常にトリッキー! – Anthony

+0

@Anthony、それは署名(スペルを見てください) – JaredPar

+1

Hehehe、私は実際にジョンですが、Skeetが来たら、私は間違いなく彼に感謝します:) –

答えて

3

これを回避する方法は、偶然にもほとんどありませんでした。

RichTextBoxに読み込まれるコンテンツは、単純な文字列として保存(または入力)されます。 RichTextBoxをサブクラス化して、Documentプロパティとのバインディングを許可しています。質問に関連する何

、私は(溶液への非必須コードが取り除かれている)、このようになりますIValueConverterの変換()過負荷を持っているということです。

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; 

これは私を取得RichTextBoxに平易な文字列を移動して書式を設定したいという振る舞いをして、Word文書に埋め込まれているリンクではなく、通常のリンクのように動作するリンクを生成します。

+0

var textSplitはどのように作成されましたか? –

+0

この回答には、最大upvotesが必要です。 –

0

Clickイベントの代わりにMouseLeftButtonDownイベントを処理しようとしましたか?

17

解決策が見つかりました。 IsDocumentEnabledを "True"に設定し、IsReadOnlyを "True"に設定します。

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

私はこれをしなかったら、私はハイパーリンクタグ内に表示されるテキストにカーソルを合わせると、マウスが「手」に変わるでしょう。コントロールを保持せずにクリックすると、 'Click'イベントが発生します。

私はWPFを.NET 4から使用しています。以前のバージョンの.NETが上記のように機能しないかどうかはわかりません。

+5

これは、コピーアンドペーストの目的でテキストを選択できないようにするという、忘れられない副作用があります。 – Julien

10

JHubbard80の回答が可能ですが、コンテンツを選択する必要がない場合は、最も簡単な方法です。

しかし、私はそれが必要です:ここで私のアプローチです:RichTextBoxの内部にHyperlinkのスタイルを設定します。重要なのは、EventSetterを使用してMouseLeftButtonDownイベントを処理することです。

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

そして、分離コードで:inspiarationためgcores

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

感謝。

+0

私は手を得ることはできませんが、何でも。それはうまく動作し、ハイパーリンクのナビゲーションコードにアクセスできます。ディレクトリが存在しない場合、私のアプリはクラッシュしません! – Darkhydro

+0

クリックイベントを処理することができました。それはWindowsの10/WPF 4.5のものかもしれないが、それは働いた。ありがとう。 –

関連する問題