Отображать изображения в текстовом блоке (WPF)

StackOverflow https://stackoverflow.com/questions/727248

  •  05-09-2019
  •  | 
  •  

Вопрос

Я работаю над простым приложением для чата.В настоящее время сообщения привязаны к списку в пользовательском стиле, подобному этому (упрощенный XAML):

<ListBox ItemsSource="{Binding MessageCollection}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Text}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Теперь я хотел бы иметь возможность вставлять изображения (например, графические смайлики) в отображаемый текст сообщения.Есть ли какой-нибудь способ добиться этого с помощью TextBlock (или любого другого стандартного компонента) или мне нужно использовать для этого какой-то специальный элемент управления?

Заранее спасибо

Это было полезно?

Решение

Если вам нужны Изображения на самом деле внутри текст (например, смайлик), затем вам придется проделать некоторую работу.Похоже, это один из немногих случаев, когда мне действительно нужен пользовательский элемент управления, суть которого заключалась бы в сканировании текста в поисках значений смайликов и создании шаблона данных "на лету".

Помните, что все, что вы можете сделать в XAML, вы можете сделать и в коде, поэтому код, о котором я думаю, будет следовать этой общей идее:

  1. Сканируйте текст на наличие значений смайликов и создайте список значений для данных элементов.
  2. Создайте док-панель.
  3. Для каждого элемента в списке добавьте либо текстовый блок, либо изображение (в зависимости от значения).
  4. Установите это.Содержимое на DockPanel.

Я думаю, что что-то подобное - это на самом деле то, что вы ищете, но если вам нужно просто изображение, то предложение ValueConverter сработает.

Другие советы

Просто используйте встроенный Uicontainer.

<TextBlock TextWrapping="Wrap">
    <Run>Some text.</Run>
    <InlineUIContainer>
        <Image Source="http://sstatic.net/stackoverflow/img/apple-touch-icon.png" Height="20"></Image>
    </InlineUIContainer>
    <Run>Some more text.</Run>
</TextBlock>

Содержимое текстового блока всегда представляет собой просто серию входных строк, поэтому вам следует использовать InlineUIContainer .Вы можете вставить этот контейнер в качестве одной из встроенных строк в свой текстовый блок везде, где вы хотите, чтобы отображалось изображение, чередующееся с текстовыми вставками.Вы могли бы проанализировать сообщение и в то же время продолжать добавлять найденные маркеры (текст или изображения) в коллекцию Inlines текстового блока.

Вы могли бы использовать конвертер значений для преобразования текста в другой тип, который содержит список сегментов, состоящих либо из текста, либо из смайлика (в том порядке, в котором они появляются).

Затем вы можете использовать шаблон данных для привязки к этому новому типу и соответствующего отображения текста и смайликов.

Я также недавно столкнулся с этой проблемой, и я преодолел это с помощью

Создаем ListBox ItemTemplate, содержащий ItemsControl, который имеет панель-оболочку в ItemsPanelTemplate, а затем привязываем мою строку к ItemsSource ItemsControl с помощью IValueConverter, в котором содержится вся логика.

Разделите свои слова и выполните запрос / поиск по строкам смайликов, гиперссылкам и т.д. И создайте свой текстовый блок, изображение, гиперссылку, элементы кнопок и задайте свои значения и дескрипторы событий.

В функции создайте список<UIElement> и заполните список сгенерированными вами элементами управления и верните Список в качестве объекта в функции преобразования IValueConverter.

Поскольку у вас там есть WrapPanel, вы завершаете свою обертку.

Используйте элемент Image вместо TextBlock и используйте Конвертер для сопоставления текстового значения с изображением улыбки.

<ListBox ItemsSource="{Binding MessageCollection}">
<ListBox.ItemTemplate>
    <DataTemplate>
        <Image Source="{Binding Text, Converter={StaticResource MyImageConverter}}"/>
    </DataTemplate>
</ListBox.ItemTemplate>

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top