リンク付きのC#WPFテキスト
-
26-09-2019 - |
質問
私はちょうど自分自身に新しい挑戦を見つけました:プレーンテキストよりもWebのように処理するワードプロセッサを作成します。これのための素晴らしいフレームワークを設計することは、私が最初に待つことができないことですが、私はGUI側での可能性が何であるかを知る必要があります(おそらくGUIの課題がたくさんあるでしょう)。
したがって、テキストの一部をクリック可能 /マウスオーバー可能にすることができるある種の制御が必要な基本的なもの。
私はWPFにちょっと初めてで、これを行う方法がわかりません。誰かがこれを作る方法を持っていますか?例はありますか?これのコントロールはすでにありますか?
前もって感謝します
編集:
richtextboxでそれを行う方法を見つけました:
// Create a FlowDocument to contain content for the RichTextBox.
FlowDocument myFlowDoc = new FlowDocument();
// Add paragraphs to the FlowDocument.
Hyperlink myLink = new Hyperlink();
myLink.Inlines.Add("hyperlink");
myLink.NavigateUri = new Uri("http://www.stackoverflow.com");
// Create a paragraph and add the Run and hyperlink to it.
Paragraph myParagraph = new Paragraph();
myParagraph.Inlines.Add("check this link out: ");
myParagraph.Inlines.Add(myLink);
myFlowDoc.Blocks.Add(myParagraph);
// Add initial content to the RichTextBox.
richTextBox1.Document = myFlowDoc;
私は今、私のテキストボックスに素敵なハイパーリンクを取得します...私がそれをクリックするときを除いて、何も起こりません。ここに何が欠けていますか?
解決
使用できます ハイパーリンク クラス。これはFrameworkContentElementであるため、TextBlockまたはFlowDocument、またはコンテンツを埋め込むことができる他の場所で使用できます。
<TextBlock>
<Run>Text</Run>
<Hyperlink NavigateUri="http://stackoverflow.com">with</Hyperlink>
<Run>some</Run>
<Hyperlink NavigateUri="http://google.com">hyperlinks</Hyperlink>
</TextBlock>
あなたはaの使用を見たいかもしれません richtextbox 編集者の一部として。これにより、HyperLinksなどのコンテンツを含めることができるFlowDocumentがホストされます。
更新:ハイパーリンクのクリックを処理する方法は2つあります。 1つはを処理することです RequestNavigate イベント。それは ルーティングイベント, 、したがって、ハンドラーをハイパーリンク自体に添付するか、ウィンドウやrichtextboxなどのツリー内の要素にそれを取り付けることができます。
// On a specific Hyperlink
myLink.RequestNavigate +=
new RequestNavigateEventHandler(RequestNavigateHandler);
// To handle all Hyperlinks in the RichTextBox
richTextBox1.AddHandler(Hyperlink.RequestNavigateEvent,
new RequestNavigateEventHandler(RequestNavigateHandler));
もう1つの方法は使用することです 指揮 を設定します 指示 ハイパーリンクのプロパティ icommand 実装。 ICommandの実行されたメソッドは、ハイパーリンクがクリックされたときに呼び出されます。
ハンドラーでブラウザを起動する場合は、URIを渡すことができます process.start:
private void RequestNavigateHandler(object sender, RequestNavigateEventArgs e)
{
Process.Start(e.Uri.ToString());
}
他のヒント
また、RichTextBoxに次のプロパティを設定する必要があるか、ハイパーリンクが無効になり、イベントを発射しないことに注意してください。 Isreadonlyがなければ、ハイパーリンクをCtrlクリックする必要があります。Isreadonlyを使用して、通常の左クリックで発射します。
<RichTextBox
IsDocumentEnabled="True"
IsReadOnly="True">
最も簡単な方法は、このようなrequestNavigateイベントを処理することです。
...
myLink.RequestNavigate += HandleRequestNavigate;
...
private void HandleRequestNavigate(object sender, RoutedEventArgs e)
{
var link = (Hyperlink)sender;
var uri = link.NavigateUri.ToString();
Process.Start(uri);
e.Handled = true;
}
URLをProcess.startに渡すことにより、デフォルトのブラウザを起動することにいくつかの問題があります。