13

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

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

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

提前致谢

4

6 回答 6

55

只需使用 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>
于 2011-04-07T23:42:23.323 回答
4

TextBlock 的内容始终只是一系列内联,因此您应该使用 InlineUIContainer。您可以将此容器作为 TextBlock 中的内联之一插入您希望图像出现的任何位置,与文本运行交替。您可以解析一条消息,同时继续将您找到的标记(文本或图像)添加到 TextBlock 的 Inlines 集合中。

于 2009-05-05T13:13:54.523 回答
1

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

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

于 2009-04-07T19:34:23.697 回答
1

如果您希望图像实际上包含在文本中(如表情符号),那么您将不得不做一些工作。这听起来像是我真正想要一个用户控件的少数几次之一,其要点是扫描文本以查找表情符号值并动态构建数据模板。

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

  1. 扫描文本以获取表情符号值并为数据元素创建值列表。
  2. 创建一个 DockPanel。
  3. 对于 List 中的每个元素,添加一个 TextBlock 或一个 Image(基于值)。
  4. 将 this.Content 设置为 DockPanel。

我认为这样的东西实际上是您正在寻找的东西,但是如果您只想要一个图像,那么 ValueConverter 建议就可以了。

于 2009-04-07T19:54:34.367 回答
1

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

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

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

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

因为你有 WrapPanel 在那里你完成了你的包装。

于 2012-04-12T15:49:44.207 回答
-1

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

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

于 2009-04-07T19:38:13.597 回答