Finding all Images in a FlowDocument

后端 未结 4 1788
花落未央
花落未央 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:14

    Little change in Code to add coverage for 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());
        }
    
    0 讨论(0)
  • 2020-12-19 18:16
    
    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 讨论(0)
  • 2020-12-19 18:23

    Little change in Code to add coverage for Figure and Floater

    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());
        }
    
    0 讨论(0)
  • 2020-12-19 18:32

    LINQ is just freaking 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());
    }
    
    0 讨论(0)
提交回复
热议问题