Hyperlink
タグは保存しても失われないため、別のアプローチとして、ロードされたドキュメントでこれらのタグをスキャンし、そのプロパティ(クリックイベントとナビゲートURI)を再適用します。
void restoreHyperlinks()
{
TextRange tr = new TextRange(_richTextBox.Document.ContentStart, _richTextBox.Document.ContentEnd);
TextPointer tp = tr.Start;
bool bFound = false;
foreach (System.Text.RegularExpressions.Match match in UrlRegex.Matches(tr.Text))
{
if (tp == null)
tp = tr.Start;
bFound = false;
while (tp != null && !bFound)
{
if (tp.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.Text)
{
string textRun = tp.GetTextInRun(LogicalDirection.Forward);
int indexInRun = textRun.IndexOf(match.Value);
if (indexInRun > -1)
{
bFound = true;
Inline parent = tp.Parent as Inline;
while (parent != null && !(parent is Hyperlink))
{
parent = parent.Parent as Inline;
}
if (parent is Hyperlink)
{
Hyperlink hyperlink = (Hyperlink)parent;
if (isHyperlink(match.Value))
{
Uri uri = new Uri(match.Value, UriKind.RelativeOrAbsolute);
if (!uri.IsAbsoluteUri)
{
uri = new Uri(@"http://" + match.Value, UriKind.Absolute);
}
if (uri != null)
{
hyperlink.NavigateUri = uri;
hyperlink.Click += Hyperlink_Click;
}
}
}
}
}
tp = tp.GetNextContextPosition(LogicalDirection.Forward);
}
}
}
正規表現は次のとおりです。
private static readonly System.Text.RegularExpressions.Regex UrlRegex = new System.Text.RegularExpressions.Regex(@"(?#Protocol)(?:(?:ht|f)tp(?:s?)\:\/\/|~/|/)?(?#Username:Password)(?:\w+:\w+@)?(?#Subdomains)(?:(?:[-\w]+\.)+(?#TopLevel Domains)(?:com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum|travel|[a-z]{2}))(?#Port)(?::[\d]{1,5})?(?#Directories)(?:(?:(?:/(?:[-\w~!$+|.,=]|%[a-f\d]{2})+)+|/)+|\?|#)?(?#Query)(?:(?:\?(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)(?:&(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)*)*(?#Anchor)(?:#(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)?");
isHyperlink
URLをチェックする別の方法です-コードは次の場所から取得されます:http:
//marcangers.com/detect-urls-add-hyperlinks-wpf-richtextbox-automatically/
お役に立てれば!乾杯、ステファン