2011-11-22 64 views
2

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

我有标识,我已经得到了在当前选择的超链接代码:

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

回答

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; 
    } 
} 
+0

我正在寻找类似'Remove'的东西。这会将文字留在后面吗? – ChrisF

+0

@ChrisF:使用将内容保留在原位的版本进行编辑仅删除包装超链接。 – AnthonyWJones