2010-12-10 13 views
4

Ich möchte einen Chat mit Inline-Bildern. Die Richtextbox ist gut, weil ich Bilder darin platzieren kann, aber ich möchte den Text/Bilder getrennt senden. -erste: sende den Text (und platziere einen Bild-Platzhalter im Text). -second: Senden Sie das Bild und ersetzen Sie es durch den Platzhalter.C#/WPF: Richtextbox: Finde alle Bilder

Dafür muss ich alle Bilder in der Richtextbox entfernen (und sie separat senden). Aber wie kann ich die Bilder finden?

Und btw: Ist es möglich, das Bild abhängig von der Breite der Richtextbox neu zu skalieren?

Danke :)

Antwort

6

Um alle Bilder in einem RichTextBox zu finden, müssen Sie alle Absätze und seine Inlines durchqueren; und dann kannst du mit dem Bild machen, was du brauchst. Mit dem folgenden Code wird beispielsweise die Größe (um 1 Pixel) aller Bilder in einer RichTextBox erhöht.

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

danke, cincoutprabu – user437899

2

Hinzufügen zu Prabu Arumugam Antwort kann die Block auch ein BlockUIContainer mit einem Image sein, so müssten Sie:

else if (block is BlockUIContainer) 
{ 
    var container = (BlockUIContainer)block; 
    if (container.Child is Image) 
    { 
     Image image = (Image)container.Child; 
     // ... 
    } 
} 

Ich würde es vorziehen, auch Linq-Syntax für Kompaktheit, vielleicht so etwas wie dieses :

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