[英]How to replace link to hyperlink in RichTextBox (Windows phone)
I have a text: 我有一个文字:
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.
I know how to show a hyperlink in RichTextBox: 我知道如何在RichTextBox中显示超链接:
http://msdn.microsoft.com/en-us/library/ee681613%28v=vs.95%29.aspx http://msdn.microsoft.com/en-us/library/ee681613%28v=vs.95%29.aspx
But how can I make this for everyone link in this code? 但是,如何在此代码中为每个人链接创建此链接?
You should parse the string maybe with something like RegEx or using a library like html agility pack . 您应该使用RegEx或使用类似html agility pack的库来解析字符串。 This extension method should work, letting you just call richTextBlock.SetLinkedText(htmlFragment); 这个扩展方法应该可以工作,只需调用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.");
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.