【发布时间】:2010-12-10 00:18:25
【问题描述】:
我想与内嵌图像聊天。
richtextbox很好,因为我可以在里面放图片,但是我想把文字/图片分开发送。
- 首先:发送文本(并在文本中放置一个图像占位符)。
- 第二个:发送图片并用占位符替换。
为此,我需要删除richtextbox 中的所有图像(并将它们分开发送)。 但是我怎样才能找到图像呢?
顺便说一句:是否可以根据富文本框的宽度重新缩放图像?
【问题讨论】:
标签: c# wpf image richtextbox
我想与内嵌图像聊天。
richtextbox很好,因为我可以在里面放图片,但是我想把文字/图片分开发送。
为此,我需要删除richtextbox 中的所有图像(并将它们分开发送)。 但是我怎样才能找到图像呢?
顺便说一句:是否可以根据富文本框的宽度重新缩放图像?
【问题讨论】:
标签: c# wpf image richtextbox
要查找RichTextBox中的所有图片,需要遍历所有Paragraphs及其Inlines;然后你可以对图像做任何你需要的事情。例如,以下代码将增加 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 也可以是 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
}
}
【讨论】: