C#/ WPF:Richtextbox:查找所有图像

我想和内联图片聊天。 richtextbox很好,因为我可以在其中放置图像,但我想将文本/图像分开发送。 -first:发送文本(并在文本中放置图像占位符)。 -second:发送图像并用占位符替换它。

为此,我需要删除richtextbox中的所有图像(并将它们分开发送)。 但是我怎么能找到这些图像呢?

顺便说一句:是否可以根据richtextbox的宽度重新缩放图像?

谢谢 :)

要查找RichTextBox中的所有图像,您需要遍历所有段落及其内联; 然后你可以用图像做任何你需要的事情。 例如,以下代码将增加RichTextBox内所有图像的大小(按1像素)。

public static void ResizeRtbImages(RichTextBox rtb) { foreach (Block block in rtb.Blocks) { if (block is Paragraph) { Paragraph paragraph = (Paragraph)block; foreach (Inline inline in paragraph.Inlines) { if (inline is InlineUIContainer) { InlineUIContainer uiContainer = (InlineUIContainer)inline; if (uiContainer.Child is Image) { Image image = (Image)uiContainer.Child; image.Width = image.ActualWidth + 1; image.Height = image.ActualHeight + 1; } } } } } } 

添加到Prabu Arumugam的答案, Block也可以是带有ImageBlockUIContainer ,因此您需要:

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

我也更喜欢Linq语法的紧凑性,可能是这样的:

 public static void ResizeRtbImages(RichTextBox rtb) { IEnumerable images = rtb.Document.Blocks.OfType() .Select(c => c.Child).OfType() .Union(rtb.Documents.Blocks.OfType() .SelectMany(pg => pg.Inlines.OfType()) .Select(inline => inline.Child).OfType() ); foreach (var image in images) { // resize } }