【问题标题】:How to replace link to hyperlink in RichTextBox (Windows phone)如何替换 RichTextBox 中超链接的链接(Windows 手机)
【发布时间】:2012-05-09 12:30:46
【问题描述】:

我有一条短信:

Download it directly to the <a href="http://itunes.apple.com/fi/app/goalapp/id502461189?ls=1&mt=8">iTunes Store</a> or <a href="https://market.android.com/details?id=com.strikersoft.meramal.se">Android Market</a>. The application is launched for Swedish app store.

我知道如何在 RichTextBox 中显示超链接:

http://msdn.microsoft.com/en-us/library/ee681613%28v=vs.95%29.aspx

但是我怎样才能在这段代码中为每个人创建这个链接呢?

【问题讨论】:

  • 你怎么能做出什么for everyone link in什么code

标签: c# silverlight windows-phone-7 silverlight-4.0 silverlight-3.0


【解决方案1】:

您应该使用 RegEx 或 html agility pack 之类的库来解析字符串。这个扩展方法应该可以工作,让你只需调用richTextBlock.SetLinkedText(htmlFragment);

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Text.RegularExpressions;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

public static class RichTextBlockExtensions
{
    public static void SetLinkedText(this RichTextBlock richTextBlock, string htmlFragment)
    {
        var regEx = new Regex(
            @"\<a\s(href\=""|[^\>]+?\shref\="")(?<link>[^""]+)"".*?\>(?<text>.*?)(\<\/a\>|$)",
            RegexOptions.IgnoreCase | RegexOptions.Multiline);

        richTextBlock.Blocks.Clear();

        int nextOffset = 0;

        foreach (Match match in regEx.Matches(htmlFragment))
        {
            if (match.Index > nextOffset)
            {
                richTextBlock.AppendText(htmlFragment.Substring(nextOffset, match.Index - nextOffset));
                nextOffset = match.Index + match.Length;
                richTextBlock.AppendLink(match.Groups["text"].Value, new Uri(match.Groups["link"].Value));
            }

            Debug.WriteLine(match.Groups["text"] + ":" + match.Groups["link"]);
        }

        if (nextOffset < htmlFragment.Length)
        {
            richTextBlock.AppendText(htmlFragment.Substring(nextOffset));
        }
    }

    public static void AppendText(this RichTextBlock richTextBlock, string text)
    {
        Paragraph paragraph;

        if (richTextBlock.Blocks.Count == 0 ||
            (paragraph = richTextBlock.Blocks[richTextBlock.Blocks.Count - 1] as Paragraph) == null)
        {
            paragraph = new Paragraph();
            richTextBlock.Blocks.Add(paragraph);
        }

        paragraph.Inlines.Add(new Run { Text = text });
    }

    public static void AppendLink(this RichTextBlock richTextBlock, string text, Uri uri)
    {
        Paragraph paragraph;

        if (richTextBlock.Blocks.Count == 0 ||
            (paragraph = richTextBlock.Blocks[richTextBlock.Blocks.Count - 1] as Paragraph) == null)
        {
            paragraph = new Paragraph();
            richTextBlock.Blocks.Add(paragraph);
        }

        var run = new Run { Text = text };
        var link = new Hyperlink { NavigateUri = uri };

        link.Inlines.Add(run);
        paragraph.Inlines.Add(link);
    }
}

public partial class MainPage : UserControl
{
    public MainPage()
    {
        InitializeComponent();
        this.richTextBlock.SetLinkedText(
            "Download it directly to the <a href=\"http://itunes.apple.com/fi/app/goalapp/id502461189?ls=1&mt=8\">iTunes Store</a> or <a href=\"https://market.android.com/details?id=com.strikersoft.meramal.se\">Android Market</a>. The application is launched for Swedish app store.");
    }
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-06
  • 2020-07-20
  • 2010-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多