40

こんにちは、データベースにいくつかのテキストがあり、次のとおりです。

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis tellus nisl, venenatis et pharetra ac, tempor sed sapien. Integer pellentesque blandit velit, in tempus urna semper sit amet. Duis mollis, libero ut consectetur interdum, massa tellus posuere nisi, eu aliquet elit lacus necerat. commodo quam を提示します。**[a href=' http://somesite.com ']いくつかのサイト[/a]** suspendisse at nisi sit amet massa molestie gravida feugiat ac sem. Phasellus ac mauris ipsum, vel auctor odio

私の質問は: どうすれば aHyperlinkを aに表示できTextBlockますか? この目的で webBrowser コントロールを使用したくありません。このコントロールも使用したくありません: http://www.codeproject.com/KB/WPF/htmltextblock.aspx

4

4 に答える 4

109

表示はかなり単純ですが、ナビゲーションは別の問題です。XAML は次のようになります。

<TextBlock Name="TextBlockWithHyperlink">
    Some text 
    <Hyperlink 
        NavigateUri="http://somesite.com"
        RequestNavigate="Hyperlink_RequestNavigate">
        some site
    </Hyperlink>
    some more text
</TextBlock>

また、ハイパーリンクに移動するために既定のブラウザーを起動するイベント ハンドラーは次のようになります。

private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e) {
    System.Diagnostics.Process.Start(e.Uri.ToString());
}

編集:データベースから取得したテキストでそれを行うには、何らかの方法でテキストを解析する必要があります。テキスト部分とハイパーリンク部分がわかれば、テキストブロックのコンテンツをコード内で動的に構築できます。

TextBlockWithHyperlink.Inlines.Clear();
TextBlockWithHyperlink.Inlines.Add("Some text ");
Hyperlink hyperLink = new Hyperlink() {
    NavigateUri = new Uri("http://somesite.com")
};
hyperLink.Inlines.Add("some site");
hyperLink.RequestNavigate += Hyperlink_RequestNavigate;
TextBlockWithHyperlink.Inlines.Add(hyperLink);
TextBlockWithHyperlink.Inlines.Add(" Some more text");
于 2010-01-19T11:19:14.697 に答える
16

このような状況では、値コンバーターで正規表現を使用できます。

これを要件に使用します(元のアイデアはhereから):

    private Regex regex = 
        new Regex(@"\[a\s+href='(?<link>[^']+)'\](?<text>.*?)\[/a\]",
        RegexOptions.Compiled);

これは、リンクを含む文字列内のすべてのリンクに一致し、各一致に対して 2 つの名前付きグループを作成しますlinktext

これで、すべての一致を繰り返すことができます。各試合はあなたに

    foreach (Match match in regex.Matches(stringContainingLinks))
    { 
        string link    = match.Groups["link"].Value;
        int link_start = match.Groups["link"].Index;
        int link_end   = match.Groups["link"].Index + link.Length;

        string text    = match.Groups["text"].Value;
        int text_start = match.Groups["text"].Index;
        int text_end   = match.Groups["text"].Index + text.Length;

        // do whatever you want with stringContainingLinks.
        // In particular, remove whole `match` ie [a href='...']...[/a]
        // and instead put HyperLink with `NavigateUri = link` and
        // `Inlines.Add(text)` 
        // See the answer by Stanislav Kniazev for how to do this
    }

注 :ConvertToHyperlinkedTextカスタム値コンバーターでこのロジックを使用します。

于 2010-01-22T16:16:38.440 に答える