8

私は自分自身に新たな課題を見つけました: プレーン テキストよりも Web のように処理するワープロを作成することです。このための優れたフレームワークを設計することから始めるのが待ちきれませんが、GUI 側でどのような可能性があるかを知る必要があります (おそらく GUI の課題がたくさんあるでしょう)。

したがって、テキストの一部をクリック可能/マウスオーバー可能にすることができるある種のコントロールが必要であるという基本的なこと。

私はWPFが初めてで、これを行う方法がわかりません。これを作る方法を知っている人はいますか?例はありますか?これに対するコントロールはすでにありますか?

前もって感謝します

編集:

リッチテキストボックスでそれを行う方法を見つけました:

// 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;

テキストボックスに素敵なハイパーリンクが表示されるようになりました...クリックしても何も起こりません。ここで何が欠けていますか?

4

3 に答える 3

25

Hyperlinkクラスを使用できます。これは 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>

エディターの一部としてRichTextBoxを使用することを検討することをお勧めします。これは、ハイパーリンクなどのコンテンツを含むことができる FlowDocument をホストします。


更新: ハイパーリンクのクリックを処理するには 2 つの方法があります。1 つはRequestNavigateイベントを処理することです。これはRouted Eventであるため、Hyperlink 自体にハンドラーをアタッチするか、ウィンドウや 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 つの方法は、Hyperlink のCommandプロパティをICommand実装に設定してコマンドを使用することです。ハイパーリンクがクリックされると、ICommand の Executed メソッドが呼び出されます。

ハンドラーでブラウザーを起動する場合は、URI をProcess.Startに渡すことができます。

private void RequestNavigateHandler(object sender, RequestNavigateEventArgs e)
{
    Process.Start(e.Uri.ToString());
}
于 2010-08-05T12:13:06.707 に答える
4

RichTextBox で次のプロパティも設定する必要があることに注意してください。そうしないと、ハイパーリンクが無効になり、イベントが発生しなくなります。IsReadOnly を使用しない場合は、ハイパーリンクを Ctrl キーを押しながらクリックする必要があります。IsReadOnly を使用すると、通常の左クリックで起動します。

<RichTextBox
    IsDocumentEnabled="True"
    IsReadOnly="True">
于 2013-10-03T19:12:40.440 に答える
1

最も簡単な方法は、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;
}

Process.Start に url を渡してデフォルト ブラウザーを起動すると、いくつかの問題が発生するため、ハンドラーを実装するためのより良い方法をグーグルで検索することをお勧めします。

于 2010-08-05T14:48:15.187 に答える