Search all images in FlowDocument

Since I'm pretty new to WPF FlowDocuments, I would like to ask if the code is correct. It should return all images contained in the FlowDocument as a List:

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; } 
+4
source share
3 answers

LINQ is just magical:

 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()); } 
+5
source

A slight change in code

  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()); } 
+2
source
 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) 
0
source

All Articles