题
我正在开发一个简单的聊天应用程序。目前,消息绑定到自定义样式的列表框,如下所示(简化的 XAML):
<ListBox ItemsSource="{Binding MessageCollection}">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Text}"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
现在我希望能够将图像(如图形笑脸)放入显示的消息文本中。有没有办法使用 TextBlock (或任何其他标准组件)来实现此目的,或者我是否需要为此使用一些特殊的控件?
提前致谢
解决方案
如果你真的想要图像 里面 文本(如表情符号),那么您将需要做一些工作。这听起来像是我真正想要一个用户控件的少数情况之一,其要点是扫描文本以查找表情符号值并动态构建数据模板。
请记住,您可以在 XAML 中执行的任何操作都可以在代码中执行,因此我正在考虑的代码将遵循以下总体思路:
- 扫描文本中的表情符号值和 为数据创建值列表 元素。
- 创建一个 DockPanel。
- Foreach 元素,添加 TextBlock 或 Image (基于值)。
- 将 this.Content 设置为 DockPanel。
我认为这样的东西实际上就是您正在寻找的东西,但如果您只想要一个图像,那么 ValueConverter 建议会起作用。
其他提示
只需使用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>
TextBlock的内容是永远只是一个系列内联的,所以你应该使用InlineUIContainer。您可以插入此容器,不管你想要的形象出现在你的TextBlock的内联的一个,交替使用文本运行。你可以解析的消息,并在同一时间继续增加,你觉得到TextBlock的内联集的令牌(文本或图像)。
您可以使用一个值转换器,用于将文本转换为另一种类型的,其具有由文字或笑脸(在它们出现的顺序)的段的列表。
然后,可以使用一个数据模板绑定到新类型,并显示文本和笑脸适当。
我最近也遇到了这个问题,并通过我
克服这个创建列表框的ItemTemplate包含一个具有在一个ItemsPanelTemplate WrapPanel一个ItemsControl然后我的字符串结合的ItemsControl的的ItemsSource与容纳所有的逻辑一的IValueConverter。
拆出你的话,查询/搜索你的表情符号的字符串,超链接等,并创建你的TextBlock,图片,超链接,按钮元素,并设置你的价值观和事件句柄。
在该函数创建一个列表<的UIElement>和填充已生成的控制列表并返回列表作为的IValueConverter的转换函数的对象。
由于你有WrapPanel在那里你得到你的包装完成。
使用Image元素代替的TextBlock并使用转换器来映射的文本值到微笑的图像。
<ListBox ItemsSource="{Binding MessageCollection}">
<ListBox.ItemTemplate>
<DataTemplate>
<Image Source="{Binding Text, Converter={StaticResource MyImageConverter}}"/>
</DataTemplate>
</ListBox.ItemTemplate>