2010-09-21 65 views
1

我有一个WPF应用程序,用户可以在RichTextBox中粘贴一些Word数据......但如果这个单词数据有图像,我需要删除它,我该怎么做呢? 由于FlowDocument是xml,也许做一些linq魔术可以做到这一点,但我不知道如何:/从RichTextBox中移除图像FlowDocument

+0

LogicalTreeUtility用于获取FlowDocument中的特定元素,可能在此处可以使用:http://www.eggheadcafe.com/tutorials/aspnet/233d3397-0388-473c-8473-721a40cf910c/wpf- custom-find-control-for-flowdocuments.aspx – 2010-09-23 21:05:55

回答

0

有一个名为WordtoXAML转换器(http://wordtoxaml.codeplex.com)的工具。您可以使用它将Word文档内容转换为XAML,使用正则表达式匹配来识别图像,然后将其去除。

+0

那么,从Word粘贴的RichTextBox托管FlowDocument将执行转换,因此向解决方案添加第三方工具不会使此任务变得更加简单。 – 2010-09-23 21:02:34

0

下面的代码将做你想要的。虽然它可能有点浪费(它会查看整个文档而不是刚刚粘贴的位),但它是唯一的方法,因为有时RichTextBox在指示最近绘制的范围时不准确:

public class MyTextBox : RichTextBox 
    { 

     public MyTextBox() 
     { 
      CommandBindings.Add(new CommandBinding(ApplicationCommands.Paste, Paste)); 
     } 

     protected virtual void Paste(object sender, ExecutedRoutedEventArgs e) 
     { 
      Paste(); 

      foreach (var image in FindImages()) 
      { 
       if (image.SiblingInlines != null) 
       { 
        image.SiblingInlines.Remove(image); 
       } 
      } 
     } 

     IEnumerable<InlineUIContainer> FindImages() 
     { 
      var result = new List<InlineUIContainer>(); 
      var blocks = Document.Blocks; 
      for (TextPointer position = blocks.FirstBlock.ElementStart; position != null && position.CompareTo(blocks.LastBlock.ElementEnd) != 1; position = position.GetNextContextPosition(LogicalDirection.Forward)) 
      { 
       InlineUIContainer element = position.Parent as InlineUIContainer; 
       if (element != null && element.Child is Image) 
       { 
        result.Add(element); 
       } 
      } 
      return result; 
     } 
    }