在RichTextBox中查找所有图片

5

我希望能够拥有一个带有内联图片的聊天界面。

虽然richtextbox可以插入图片,但我想要单独发送文本和图片。

  • 第一步:发送文本(并在文本中放置一个图片占位符)。
  • 第二步:发送图片并用占位符替换它。

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

另外,是否可以根据richtextbox的宽度重新调整图片大小?

2个回答

9

要在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;
                    }
                }
            }
        }
    }
}

4

在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<Image> images = rtb.Document.Blocks.OfType<BlockUIContainer>()
            .Select(c => c.Child).OfType<Image>()
        .Union(rtb.Documents.Blocks.OfType<Paragraph>()
            .SelectMany(pg => pg.Inlines.OfType<InlineUIContainer>())
            .Select(inline => inline.Child).OfType<Image>()
        );
    foreach (var image in images)
    {
        // resize
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接