2010-12-10 44 views
4

Je veux discuter avec des images en ligne. La zone richtext est bonne, parce que je peux y placer des images, mais je veux envoyer le texte/les images séparément. -first: envoie le texte (et place un espace-image dans le texte). -second: envoie l'image et remplace-la par l'espace réservé.C#/WPF: Richtextbox: Trouver toutes les images

Pour cela, j'ai besoin de supprimer toutes les images dans la zone de texte riche (et les envoyer séparément). Mais comment puis-je trouver les images?

Et btw: Est-il possible de redimensionner l'image en fonction de la largeur de la zone richtext?

Merci :)

Répondre

6

Pour trouver toutes les images dans un RichTextBox, vous devez traverser à travers tous les paragraphes et ses Inlines; et alors vous pouvez faire tout ce dont vous avez besoin avec l'image. Par exemple, le code suivant augmentera la taille (de 1 pixel) de toutes les images dans un RichTextBox.

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

merci, cincoutprabu – user437899

2

Ajout à la réponse de Prabu Arumugam, le Block peut aussi être un BlockUIContainer avec un Image, donc vous auriez besoin:

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

Je préférerais également la syntaxe LINQ pour la compacité, peut-être quelque chose comme ça :

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