UWP开发入门(八)——聊天窗口和ItemTemplateSelector

简介: 原文:UWP开发入门(八)——聊天窗口和ItemTemplateSelector  我们平常用的最多的APP可能就是企鹅和微信了。有没有想过聊天窗口如何实现的?本篇我们将简单模拟一个聊天窗口。   聊天窗口大致上就是消息的一个集合列表。
原文: UWP开发入门(八)——聊天窗口和ItemTemplateSelector

  我们平常用的最多的APP可能就是企鹅和微信了。有没有想过聊天窗口如何实现的?本篇我们将简单模拟一个聊天窗口。

  聊天窗口大致上就是消息的一个集合列表。集合列表最常见的展现形式无非就是ListView。可能有些童鞋会觉得ListView的样式和聊天窗口相去甚远,虽然我们可以通过自定义ItemTemplate来修改元素的显示效果,但如何将ListView的元素以不同样式展现呢?这就要通过ListViewItemTempateSelector属性来实现了。基本原理是通过条件判断,返回不同的DataTemplateListViewItem使用。

  首先我们来定义ViewModel层的消息集合,集合共有两种不同类型的消息,分别是普通文本信息和红包消息。这两种又需要区别是接受的消息(来自对方)和发送消息(自己发出)。

    public abstract class MessageBase
    {
        public string Name { get; set; }

        public DateTime Published { get; set; }
    }

    public class Message : MessageBase
    {
        public string Comment { get; set; }

        public bool IsSelf { get; set; }
    }

    public class Gift : Message
    {
        public int Amount { get; set; }
    }

  其次我们要定义展现消息的DataTemplate,同样分为普通文字消息和红包消息。MessageDataTemplate和SelfMessageDataTemplate就是左右对称的对话框气泡,GiftDataTemplate就是红包的样式啦。

        <DataTemplate x:Key="MessageDataTemplate">
            <Grid HorizontalAlignment="Left"  >
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"></RowDefinition>
                    <RowDefinition Height="Auto"></RowDefinition>
                </Grid.RowDefinitions>
                <Grid Grid.Row="0" CornerRadius="4" Background="LightGray" Padding="15">
                    <TextBlock Text="{Binding Comment}"></TextBlock>
                </Grid>
                <StackPanel Grid.Row="1" Orientation="Horizontal">
                    <TextBlock Text="{Binding Name}" Foreground="LightGray"></TextBlock>
                    <TextBlock Text="{Binding Published}"  Foreground="LightGray" Margin="10,0,0,0"></TextBlock>
                </StackPanel>
            </Grid>
        </DataTemplate>

        <DataTemplate x:Key="SelfMessageDataTemplate">
            <Grid HorizontalAlignment="Right"  >
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"></RowDefinition>
                    <RowDefinition Height="Auto"></RowDefinition>
                </Grid.RowDefinitions>
                <Grid Grid.Row="0" CornerRadius="4" Background="Green" Padding="15">
                    <TextBlock Text="{Binding Comment}" Foreground="White"></TextBlock>
                </Grid>
                <StackPanel Grid.Row="1"  Orientation="Horizontal" HorizontalAlignment="Right">
                    <TextBlock Text="{Binding Published}"  Foreground="LightGray" Margin="0,0,10,0"></TextBlock>
                    <TextBlock Text="{Binding Name}" Foreground="LightGray"></TextBlock>
                </StackPanel>
            </Grid>
        </DataTemplate>

        <DataTemplate x:Key="GiftDataTemplate">
            <Grid HorizontalAlignment="Left"  >
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"></RowDefinition>
                    <RowDefinition Height="Auto"></RowDefinition>
                </Grid.RowDefinitions>
                <Grid Grid.Row="0" CornerRadius="4" Background="Orange"  Padding="10">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto"></RowDefinition>
                        <RowDefinition Height="Auto"></RowDefinition>
                        <RowDefinition Height="Auto"></RowDefinition>
                    </Grid.RowDefinitions>
                    <Ellipse Grid.Row="0" Width="50" Height="50" Fill="Red" Stroke="Gold" StrokeThickness="4"></Ellipse>
                    <TextBlock Grid.Row="0" Text="红包" TextAlignment="Center" VerticalAlignment="Center"></TextBlock>
                    <TextBlock Grid.Row="1" Text="{Binding Amount}" TextAlignment="Center"></TextBlock>
                    <TextBlock Grid.Row="2" Text="{Binding Comment}" TextAlignment="Center" ></TextBlock>
                </Grid>
                <StackPanel Grid.Row="1" Orientation="Horizontal">
                    <TextBlock Text="{Binding Name}" Foreground="LightGray"></TextBlock>
                    <TextBlock Text="{Binding Published}"  Foreground="LightGray" Margin="10,0,0,0"></TextBlock>
                </StackPanel>
            </Grid>
        </DataTemplate>

  接下来就是如何应用ItemTemplateSelector了,我们需要创建继承自DataTemplateSelector的子类,并且override SelectTemplateCore方法。该方法将我们在App.xaml中定义的DataTemplate资源文件根据集合众不同的元素返回对应的模板。

    public class MessageItemDataTemplateSelector : DataTemplateSelector
    {
        protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
        {
            if (item is Gift)
            {
                return App.Current.Resources["GiftDataTemplate"] as DataTemplate;
            }
            else if (item is Message)
            {
                if ((item as Message).IsSelf)
                {
                    return App.Current.Resources["SelfMessageDataTemplate"] as DataTemplate;
                }
                else
                {
                    return App.Current.Resources["MessageDataTemplate"] as DataTemplate;
                }
            }

            return base.SelectTemplateCore(item);
        }
    }

  使用之前,我们需要XAML中声明一个MessageItemDataTemplateSelector类型的实例。

<local:MessageItemDataTemplateSelector x:Key="MessageItemDataTemplateSelector"></local:MessageItemDataTemplateSelector>

  然后BindingListViewItemTemplateSelector属性。

    <ListView Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" 
              ItemTemplateSelector="{StaticResource MessageItemDataTemplateSelector}"
              ItemsSource="{Binding MessageList}">
        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter>
                <Setter Property="Margin" Value="10"></Setter>
            </Style>
        </ListView.ItemContainerStyle>
    </ListView>

  运行看一下效果,是不是蛮简单的?

  Sample的代码放在全球最大同性交友网站上,地址如下:

  https://github.com/manupstairs/UWPSamples

 

目录
相关文章
|
JavaScript 前端开发
uniapp仿微信聊天室|仿微信界面
基于uniapp+vue仿微信聊天室uniapp-chatroom项目,vue语法及类似小程序api开发原生APP应用,实现了发送图文消息、表情(gif动图),图片预览、地图位置、红包、仿微信朋友圈等功能。
2969 0
|
2月前
|
编解码 C# 数据库
C# + WPF 音频播放器 界面优雅,体验良好
【9月更文挑战第18天】这是一个用 C# 和 WPF 实现的音频播放器示例,界面简洁美观,功能丰富。设计包括播放/暂停按钮、进度条、音量控制滑块、歌曲列表和专辑封面显示。功能实现涵盖音频播放、进度条控制、音量调节及歌曲列表管理。通过响应式设计、动画效果、快捷键支持和错误处理,提升用户体验。可根据需求扩展更多功能。
106 3
|
3月前
|
开发者 C# UED
WPF多窗口应用程序开发秘籍:掌握窗口创建、通信与管理技巧,轻松实现高效多窗口协作!
【8月更文挑战第31天】在WPF应用开发中,多窗口设计能显著提升用户体验与工作效率。本文详述了创建新窗口的多种方法,包括直接实例化`Window`类、利用`Application.Current.MainWindow`及自定义方法。针对窗口间通信,介绍了`Messenger`类、`DataContext`共享及`Application`类的应用。此外,还探讨了布局控件与窗口管理技术,如`StackPanel`与`DockPanel`的使用,并提供了示例代码展示如何结合`Messenger`类实现窗口间的消息传递。总结了多窗口应用的设计要点,为开发者提供了实用指南。
209 0
|
iOS开发
iOS 常用阅读软件打开书籍的转场动画
iOS 常用阅读软件打开书籍的转场动画
93 0
|
C# 开发者
一款WPF开发的网易云音乐客户端 - DMSkin-CloudMusic
一款WPF开发的网易云音乐客户端 - DMSkin-CloudMusic
207 36
|
6月前
|
JSON C# 图形学
【Unity 3D】利用C#、Unity和Socket实现简单的在线聊天室工具(附源码 简单易懂)
【Unity 3D】利用C#、Unity和Socket实现简单的在线聊天室工具(附源码 简单易懂)
147 0
|
编译器 C# 图形学
unity2020学习(一)界面了解
了解unity游戏引擎开发界面
400 0
unity2020学习(一)界面了解
|
图形学 Windows
Unity 之 实用技巧更换编辑器主题
你的编辑器还在用灰色主题吗?还在羡慕别人的深色主题吗?教你一步修改Unity编辑器主题,赶快来看看吧 ~
1282 0
Unity 之 实用技巧更换编辑器主题
|
C#
C#使用Xamarin开发可移植移动应用(5.进阶篇显示弹出窗口与通讯中心)附源码
原文:C#使用Xamarin开发可移植移动应用(5.进阶篇显示弹出窗口与通讯中心)附源码 前言 系列目录 C#使用Xamarin开发可移植移动应用目录 源码地址:https://github.com/l2999019/DemoApp 可以Star一下,随意 - - 说点什么.
1238 0
[UWP小白日记-15]在UWP手机端实时限制Textbox的输入
原文:[UWP小白日记-15]在UWP手机端实时限制Textbox的输入 说实话重来没想到验证输入是如此的苦逼的一件事情。     网上好多验证都是在输入完成后再验证,我的想法是在输入的时候就限制输入,这样我就不用再写代码来验证了 应为是手机端,所以不用判断其他非法字符,直接把Textbox的属性InputScope设置为"Number"就是了,反正在目前版本的UWP中纯数字键盘还无法切换到其他的字符键盘去 下面的代码是一个金额文本框的验证,算是抛砖引玉吧。
1413 0