Finding all Images in a FlowDocument

后端 未结 4 1790
花落未央
花落未央 2020-12-19 17:34

Since I am pretty new to WPF FlowDocuments I would like to ask if the code below is correct. It is supposed to return all Images contained in a FlowDocument as List:

4条回答
  •  挽巷
    挽巷 (楼主)
    2020-12-19 18:23

    Little change in Code to add coverage for Figure and Floater

    public static IEnumerable FindImages(FlowDocument document)
        {
            return document.Blocks.SelectMany(block => FindImages(block));
        }        
    
        public static IEnumerable FindImages(Block block)
        {
            if (block is Paragraph)
            {
                List toReturn = new List();
                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()
                            : new List(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());
        }
    

提交回复
热议问题