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

时间:2010-12-10 00:18:26

标签: c# wpf image richtextbox

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

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

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

谢谢:)

2 个答案:

答案 0 :(得分:6)

要查找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;
                        }
                    }
                }
            }
        }
    }

答案 1 :(得分:3)

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

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
    }
}