2010-10-10 183 views
4

因爲我對WPF FlowDocuments非常陌生,所以我想問下面的代碼是否正確。它應該返回包含在FlowDocument的所有圖片排列方式:查找FlowDocument中的所有圖像

List<Image> FindAllImagesInParagraph(Paragraph paragraph) 
{ 
    List<Image> result = null; 

    foreach (var inline in paragraph.Inlines) 
    { 
     var inlineUIContainer = inline as InlineUIContainer; 
     if (inlineUIContainer != null) 
     { 
      var image = inlineUIContainer.Child as Image; 

      if (image != null) 
      { 
       if (result == null) 
        result = new List<Image>(); 

       result.Add(image); 
      } 
     } 
    } 

    return result; 
} 

private List<Image> FindAllImagesInDocument(FlowDocument Document) 
{ 
    List<Image> result = new List<Image>(); 

    foreach (var block in Document.Blocks) 
    { 
     if (block is Table) 
     { 
      var table = block as Table; 

      foreach (TableRowGroup rowGroup in table.RowGroups) 
      { 
       foreach (TableRow row in rowGroup.Rows) 
       { 
        foreach (TableCell cell in row.Cells) 
        { 
         foreach (var block2 in cell.Blocks) 
         { 
          if (block2 is Paragraph) 
          { 
           var paragraph = block2 as Paragraph; 
           var images = FindAllImagesInParagraph(paragraph); 
           if (images != null) 
            result.AddRange(images); 
          } 

          else if (block2 is BlockUIContainer) 
          { 
           var container = block as BlockUIContainer; 
           if (container.Child is Image) 
           { 
            var image = container.Child as Image; 
            result.Add(image); 
           } 
          } 
         } 
        } 
       } 
      } 
     } 

     else if (block is Paragraph) 
     { 
      var paragraph = block as Paragraph; 
      var images = FindAllImagesInParagraph(paragraph); 
      if (images != null) 
       result.AddRange(images); 
     } 

     else if (block is BlockUIContainer) 
     { 
      var container = block as BlockUIContainer; 
      if(container.Child is Image) 
      { 
       var image = container.Child as Image; 
       result.Add(image); 
      } 
     } 
    } 

    return result.Count > 0 ? result : null; 
} 

回答

5

LINQ只是嚇壞神奇:

public IEnumerable<Image> FindImages(FlowDocument document) 
{ 
    return document.Blocks.SelectMany(FindImages); 
} 

public IEnumerable<Image> FindImages(Block block) 
{ 
    if (block is Table) 
    { 
     return ((Table)block).RowGroups 
      .SelectMany(x => x.Rows) 
      .SelectMany(x => x.Cells) 
      .SelectMany(x => x.Blocks) 
      .SelectMany(FindImages); 
    } 
    if (block is Paragraph) 
    { 
     return ((Paragraph) block).Inlines 
      .OfType<InlineUIContainer>() 
      .Where(x => x.Child is Image) 
      .Select(x => x.Child as Image); 
    } 
    if (block is BlockUIContainer) 
    { 
     Image i = ((BlockUIContainer) block).Child as Image; 
     return i == null 
        ? new List<Image>() 
        : new List<Image>(new[] {i}); 
    } 
    throw new InvalidOperationException("Unknown block type: " + block.GetType()); 
} 
2

在代碼

public static IEnumerable<Image> FindImages(FlowDocument document) 
    { 
     return document.Blocks.SelectMany(block => FindImages(block)); 
    } 

    public static IEnumerable<Image> FindImages(Block block) 
    { 
     if (block is Table) 
     { 
      return ((Table)block).RowGroups 
       .SelectMany(x => x.Rows) 
       .SelectMany(x => x.Cells) 
       .SelectMany(x => x.Blocks) 
       .SelectMany(innerBlock => FindImages(innerBlock)); 
     } 
     if (block is Paragraph) 
     { 
      return ((Paragraph)block).Inlines 
       .OfType<InlineUIContainer>() 
       .Where(x => x.Child is Image) 
       .Select(x => x.Child as Image); 
     } 
     if (block is BlockUIContainer) 
     { 
      Image i = ((BlockUIContainer)block).Child as Image; 
      return i == null 
         ? new List<Image>() 
         : new List<Image>(new[] { i }); 
     } 
     if (block is List) 
     { 
      return ((List)block).ListItems.SelectMany(listItem => listItem 
                    .Blocks 
                    .SelectMany(innerBlock => FindImages(innerBlock))); 
     } 
     throw new InvalidOperationException("Unknown block type: " + block.GetType()); 
    } 
0

static IEnumerable<T> GetElementsOfType<T>(DependencyObject parent) where T : class 
{ 
    var childElements = LogicalTreeHelper.GetChildren(parent).OfType().ToList(); 
    return childElements.SelectMany(GetElementsOfType<T>).Union(childElements.OfType<T>()); 
} 
.... 
var images = GetElementsOfType<Image>(document) 
變化不大