由于我是WPF FlowDocuments的新手,我想问下面的代码是否正确。它应该返回FlowDocument中包含的所有图像作为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;
}
答案 0 :(得分:6)
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());
}
答案 1 :(得分:2)
代码几乎没有变化来添加List
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 :(得分: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)
答案 3 :(得分:0)
代码几乎没有变化,可以为人物和浮游动物
添加覆盖范围public static IEnumerable<Image> FindImages(FlowDocument document)
{
return document.Blocks.SelectMany(block => FindImages(block));
}
public static IEnumerable<Image> FindImages(Block block)
{
if (block is Paragraph)
{
List<Image> toReturn = new List<Image>();
var check = ((Paragraph)block).Inlines;
foreach (var i in check)
{
if (i is InlineUIContainer)
{
var inlineUiContainer = i as InlineUIContainer;
Image image = ((InlineUIContainer)inlineUiContainer).Child as Image;
if(image != null)
{
toReturn.Add(image);
}
}
else if (i is Figure)
{
var figure = i as Figure;
var images = figure.Blocks.SelectMany(blocks => FindImages(blocks));
toReturn.AddRange(images);
}
else if (i is Floater)
{
var floater = i as Floater;
var images = floater.Blocks.SelectMany(blocks => FindImages(blocks));
toReturn.AddRange(images);
}
}
return toReturn;
}
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 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());
}