WPF仿QQ聊天框表情文字混排实现

图中分别有文件、文本+表情、纯文本的展示,对于同一个list不同的展示形式,很明显,应该用多个DataTemplate,那么也就需要DataTemplateSelector了:class MessageDataTemplateSelector : DataTemplateSelector { public override System.Windows.D
摘要由CSDN通过智能技术生成

这个需求前后也历经了多版,上两张图给各位同学感受一下,第一张是初版,第二张是稳定不最终版~
这里写图片描述
在这里插入图片描述

图中分别有文件、文本+表情、纯文本的展示,对于同一个list不同的展示形式,很明显,应该用多个DataTemplate,那么也就需要DataTemplateSelector了:

class MessageDataTemplateSelector : DataTemplateSelector
    {
        public override System.Windows.DataTemplate SelectTemplate(object item, System.Windows.DependencyObject container)
        {
            Window win = Application.Current.MainWindow;
            var myUserNo = UserLoginInfo.GetInstance().UserNo;
            if (item!=null)
            {
                NIMIMMessage m = item as NIMIMMessage;
                if (m.SenderID==myUserNo)
                {
                    switch (m.MessageType)
                    {
                        case NIMMessageType.kNIMMessageTypeAudio:
                        case NIMMessageType.kNIMMessageTypeVideo:
                            return win.FindResource("self_media") as DataTemplate;
                        case NIMMessageType.kNIMMessageTypeFile:
                            return win.FindResource("self_file") as DataTemplate;
                        case NIMMessageType.kNIMMessageTypeImage:
                            return win.FindResource("self_image") as DataTemplate;
                        case NIMMessageType.kNIMMessageTypeText:
                            return win.FindResource("self_text") as DataTemplate;
                        default:
                            break;
                    }
                }
                else
                {
                    switch (m.MessageType)
                    {
                        case NIMMessageType.kNIMMessageTypeAudio:
                        case NIMMessageType.kNIMMessageTypeVideo:
                            return win.FindResource("friend_media") as DataTemplate;
                        case NIMMessageType.kNIMMessageTypeFile:
                            return win.FindResource("friend_file") as DataTemplate;
                        case NIMMessageType.kNIMMessageTypeImage:
                            return win.FindResource("friend_image") as DataTemplate;
                        case NIMMessageType.kNIMMessageTypeText:
                            return win.FindResource("friend_text") as DataTemplate;
                        default:
                            break;
                    }
                }
            }
            return null;
        }
    }

以上一共有8个DateTemplate,friend和self的区别就在于一个在左一个在右,我这边就放friend_text的样式代码好了,因为本篇主要说的是表情和文字的混排:

<Window.Resources>
<DataTemplate x:Key="friend_text">
            <Grid Margin="12 6">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="32"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <Image Source="{Binding TalkID}"  HorizontalAlignment="Center" VerticalAlignment="Center">
                    <Image.Clip>
                        <EllipseGeometry RadiusX="16" RadiusY="16" Center="16 16"/>
                    </Image.Clip>
                </Image>
                <Grid HorizontalAlignment="Left" Grid.Column="1"  Background="Transparent" VerticalAlignment="Center" Margin="12 0 0 0">
                    <Border CornerRadius="8" Background="#F0F0F0" Padding="6" >
                        <xctk:RichTextBox FontSize="14"
                                          VerticalScrollBarVisibility="Auto"
                                          HorizontalScrollBarVisibility="Disabled"
                                          Text="{Binding TextContent,Converter={StaticResource ShowImageOrTextConverter}}"
                                          VerticalAlignment="Center"
                                          BorderThickness="0"
                                          IsReadOnly="True"
                                          Background="Transparent">
                            <FlowDocument Name="rtbFlowDoc" PageWidth="{Binding MessageWidth}"/>
                            <xctk:RichTextBox.TextFormatter>
                                 <xctk:XamlFormatter/>
                            </xctk:RichTextBox.TextFormatter>
                        </xctk:RichTextBox>
                    </Border>
                </Grid>
            </Grid>
        </DataTemplate>
</Window.Resources>
  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 25
    评论
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值