C # / WPF: Richtextbox: Найти все изображения - PullRequest
4 голосов
/ 10 декабря 2010

Я хочу общаться со встроенными изображениями.Richtextbox хорош, потому что я могу поместить изображения в него, но я хочу отправить текст / изображения отдельно.-первое: отправьте текст (и поместите изображение-заполнитель в текст).-второе: отправьте изображение и замените его заполнителем.

Для этого мне нужно удалить все изображения в richtextbox (и отправить их отдельно).Но как я могу найти изображения?

И кстати: возможно ли изменить масштаб изображения в зависимости от ширины richtextbox?

Спасибо:)

Ответы [ 2 ]

6 голосов
/ 10 декабря 2010

Чтобы найти все изображения в RichTextBox, вам нужно пройти через все параграфы и их строки;и тогда вы можете делать с изображением все, что вам нужно.Например, следующий код увеличит размер (на 1 пиксель) всех изображений внутри 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;
                        }
                    }
                }
            }
        }
    }
3 голосов
/ 30 октября 2015

Добавляя к ответу Прабу Арумугама, 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
    }
}
...