2010-12-10 26 views
4

我想要與內嵌圖像聊天。 richtextbox好,因爲我可以在其中放置圖像,但我想單獨發送文本/圖像。 -first:發送文本(並在文本中放置圖像佔位符)。 -second:發送圖像並用佔位符替換它。C#/ WPF:Richtextbox:查找所有圖像

爲此,我需要刪除richtextbox中的所有圖像(並將它們分開發送)。 但我怎麼找到圖像?

而順便說一句:有可能根據richtextbox的寬度重新縮放圖像嗎?

謝謝:)

回答

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; 
         } 
        } 
       } 
      } 
     } 
    } 
+0

謝謝,cincoutprabu – user437899 2010-12-11 16:08:55

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