在TextBlock(WPF)中显示图像

时间:2009-04-07 19:26:19

标签: wpf chat textblock

我正在开发一个简单的聊天应用程序。目前,消息被绑定到这样的自定义样式列表框(简化的XAML):

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

现在我希望能够将图像(如图形表情符号)放入显示的消息文本中。有没有办法使用TextBlock(或任何其他标准组件)实现这一点,还是我需要使用一些特殊控件?

提前致谢

6 个答案:

答案 0 :(得分:38)

只需使用InlineUIContainer。

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

答案 1 :(得分:3)

TextBlock的内容始终只是一系列内联,因此您应该使用InlineUIContainer。您可以将此容器作为TextBlock中的一个Inlines插入,只要您想要显示图像,与文本运行交替。您可以解析一条消息,同时将您找到的标记(文本或图像)添加到TextBlock的Inlines集合中。

答案 2 :(得分:1)

您可以使用值转换器将文本转换为另一种类型,该类型具有由文本或笑脸组成的片段列表(按照它们出现的顺序)。

然后,您可以使用数据模板绑定到该新类型并适当地显示文本和笑脸。

答案 3 :(得分:1)

如果你想让图像真正里面文本(如表情符号),那么你将不得不做一些工作。这听起来像是我实际想要用户控件的少数几次之一,其中一点就是扫描Text寻找表情符号值并动态构建数据模板。

请记住,您可以在XAML中执行任何可以在代码中执行的操作,因此我正在考虑的代码将遵循以下一般概念:

  1. 扫描文本中的表情符号值和 创建数据值列表 元素。
  2. 创建一个DockPanel。
  3. 列表中的Foreach元素,添加         TextBlock或Image         (基于价值)。
  4. 将this.Content设置为DockPanel。
  5. 我认为这样的事实上是你想要的,但如果你只想要一个Image,那么ValueConverter的建议就可以了。

答案 4 :(得分:1)

我最近也遇到过这个问题,我通过

克服了这个问题

创建一个ListBox ItemTemplate,其中包含在ItemsPanelTemplate中具有WrapPanel的ItemsControl,然后使用包含所有逻辑的IValueConverter将我的字符串绑定到ItemsControl的ItemsSource。

拆分你的单词并查询/搜索你的表情字符串,超链接等,并创建你的TextBlock,图像,超链接,按钮元素,并设置你的值和事件句柄。

在函数中创建一个List&lt; UIElement&gt;并使用您生成的控件填充List,并将List作为IValueConverter的Convert函数中的对象返回。

因为你有WrapPanel,你可以完成包装。

答案 5 :(得分:-1)

使用Image元素而不是TextBlock,并使用Converter将文本值映射到微笑图像。

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