如何删除Silverlight RichTextBox中的超链接?

时间:2011-11-22 16:35:53

标签: silverlight hyperlink

我有一个RichTextBox用户可以编辑以创建超链接(在我的情况下是带有文档的另一个页面而不是外部URL)。成功创建链接后,我现在需要能够将其删除。

我有代码标识我在当前选择中有超链接:

TextSelection linkText = richTextBox.Selection;

if (linkText != null && !string.IsNullOrWhiteSpace(linkText.Text))
{
    XElement root = XElement.Parse(linkText.Xaml);
    XNamespace ns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation";
    XElement linkElement = root.Element(ns + "Paragraph").Element(ns + "Hyperlink");
    if (linkElement != null)
    {
       // Get here if have a Hyperlink. How do I remove or update?
    }
}

但是,我现在停留在if测试中的位。如何找到超链接以便我可以完全删除它?

我设置超链接的代码是:

TextSelection linkText = richTextBox.Selection;
var hyperlink = new Hyperlink();

hyperlink.Inlines.Add(linkText.Text);
if (!String.IsNullOrEmpty(selectedTopic))  // A string holding the link target
{
    // Setup hyperlink here
}

linkText.Insert(hyperlink);

我设法找出如何更新超链接:

foreach (var block in richTextBox.Blocks)
{
    Paragraph p = block as Paragraph;

    foreach (var inline in p.Inlines)
    {
        var hyperlink = inline as Hyperlink;
        if (hyperlink != null && hyperlink.NavigateUri.AbsoluteUri.Contains(currentLink))
        {
            hyperlink.NavigateUri = new Uri(newLink);
        }
    }
}

我可以使用相同的方法删除超链接,但如何将Hyperlink转换为普通Inline

1 个答案:

答案 0 :(得分:3)

看起来你越来越近了,你只需要保留对该链接的引用,然后使用Remove。像下面的东西(我喜欢使用Linq使事情更简洁): -

foreach (var p in richTextBox.Blocks.OfType<Paragraph>()) 
{ 
    var hyperlink = p.Inlines.OfType<HyperLink>()
        .FirstOrDefault(hl => hl.NavigateUri.AbsoluteUri.Contains(currentLink));

    if (hyperlink != null)
    {
         p.Inlines.Remove(hyperlink);
         break;
    }
} 

修改:想要保留超链接的内容吗? (即,只删除包装超链接),

foreach (var p in richTextBox.Blocks.OfType<Paragraph>()) 
{ 
    var hyperlink = p.Inlines.OfType<HyperLink>()
        .FirstOrDefault(hl => hl.NavigateUri.AbsoluteUri.Contains(currentLink));

    if (hyperlink != null)
    {
         int index = p.Inlines.IndexOf(hyperlink);
         Span span = new Span();

         foreach (var inline in hyperlink.Inlines.ToArray())
         {
             hyperlink.Inlines.Remove(inline);
             span.Inlines.Add(inline);
         }

         // You may need code here to preserve the Font properties etc  from hyperlink to span.

         p.Inlines[index] = span;
         break;
    }
}