【问题标题】:Find all images in a RichTextBox查找 RichTextBox 中的所有图像
【发布时间】:2010-12-10 00:18:25
【问题描述】:

我想与内嵌图像聊天。

richtextbox很好,因为我可以在里面放图片,但是我想把文字/图片分开发送。

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

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

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

【问题讨论】:

    标签: c# wpf image richtextbox


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      除了 Prabu Arumugam 的回答之外,Block 也可以是 BlockUIContainerImage,所以你需要:

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

      【讨论】:

        猜你喜欢
        • 2017-05-07
        • 1970-01-01
        • 2011-06-14
        • 2022-03-11
        • 2014-04-24
        • 2021-02-17
        • 1970-01-01
        • 1970-01-01
        • 2017-01-28
        相关资源
        最近更新 更多