![WPF制作聊天窗口获取历史聊天记录_第1页](http://file1.renrendoc.com/fileroot_temp2/2021-1/28/690ef600-12ec-406e-b75a-b2cd7170d0c2/690ef600-12ec-406e-b75a-b2cd7170d0c21.gif)
![WPF制作聊天窗口获取历史聊天记录_第2页](http://file1.renrendoc.com/fileroot_temp2/2021-1/28/690ef600-12ec-406e-b75a-b2cd7170d0c2/690ef600-12ec-406e-b75a-b2cd7170d0c22.gif)
![WPF制作聊天窗口获取历史聊天记录_第3页](http://file1.renrendoc.com/fileroot_temp2/2021-1/28/690ef600-12ec-406e-b75a-b2cd7170d0c2/690ef600-12ec-406e-b75a-b2cd7170d0c23.gif)
![WPF制作聊天窗口获取历史聊天记录_第4页](http://file1.renrendoc.com/fileroot_temp2/2021-1/28/690ef600-12ec-406e-b75a-b2cd7170d0c2/690ef600-12ec-406e-b75a-b2cd7170d0c24.gif)
![WPF制作聊天窗口获取历史聊天记录_第5页](http://file1.renrendoc.com/fileroot_temp2/2021-1/28/690ef600-12ec-406e-b75a-b2cd7170d0c2/690ef600-12ec-406e-b75a-b2cd7170d0c25.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、WPF 制作聊天窗口获取历史聊天记录腾讯从QQ2013版起开始在聊天记录里添加了历史记录查看功能,个人聊天窗口可以点击最上边的查看历史消息,而群组里的未读消息可以通过滚动鼠标中键或者拖动滚动条加载更多消息,那这个用wpf怎么实现呢?我用Scrollviewer和RichTextBox做了一个简陋尝试,真的是太陋了,大家戴好眼镜了哈。现在开始:首先是前台的陋XAML: 在基本布局里添加了一个Scrollviewer包含RichTextBox,另外添加了4个Button控件来添加简单数据。previousadd往最上端插入数据,lastadd从底部添加数据。add20快速添加20条数据使之出现滚动
2、条。好了,下面是后台陋CS实现:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Windows;using System.Windows.Controls;using System.Windows.Data;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Imaging;using
3、 System.Windows.Navigation;using System.Windows.Shapes;namespace testFlowDocument / / MainWindow.xaml 的交互逻辑 / public partial class MainWindow : Window public MainWindow() InitializeComponent(); int i = 0; private void previousadd_Click(object sender, RoutedEventArgs e) addmessage(1); / / 插入数据 / void
4、 addmessage(int pagesize) for (int j = 0; j 0) /判断是否存在数据了 RichTextBoxMessageHistory.Document.Blocks.InsertBefore(RichTextBoxMessageHistory.Document.Blocks.FirstBlock, pggethistoryNo); else /若不存在,第一条要加入而非插入 RichTextBoxMessageHistory.Document.Blocks.Add(pggethistoryNo); isEnd = false; bool isEnd = fal
5、se;/是否滚动到底部 double vScrollposition = 0;/当前接收到的所有文本内容高度(包括历史消息) private void sv_richtextbox_ScrollChanged(object sender, ScrollChangedEventArgs e) if (e.ViewportHeightChange 0) if (isEnd = true) /判断是否是从底部添加数据 if (sv_richtextbox.ScrollableHeight = sv_richtextbox.VerticalOffset) /判断滚动条是否在最底部 sv_richtex
6、tbox.ScrollToEnd(); else /定位到上次位置 double changevScrollHeight = sv_richtextbox.ExtentHeight - vScrollposition; if (changevScrollHeight 0) sv_richtextbox.ScrollToVerticalOffset(e.ViewportHeightChange + changevScrollHeight); return; sv_richtextbox.ScrollToVerticalOffset(e.ViewportHeightChange); return;
7、 private void lastadd_Click(object sender, RoutedEventArgs e) i+; Paragraph pggethistoryNo = new Paragraph(); pggethistoryNo.Background = Brushes.LightGreen; pggethistoryNo.Margin = new Thickness(60, 5, 0, 0); TextBlock tblockgethistoryNo = new TextBlock(); tblockgethistoryNo.Text = i.ToString(); tb
8、lockgethistoryNo.Foreground = Brushes.Black; pggethistoryNo.Inlines.Add(tblockgethistoryNo); RichTextBoxMessageHistory.Document.Blocks.Add(pggethistoryNo); isEnd = true; private void clearadd_Click(object sender, RoutedEventArgs e) RichTextBoxMessageHistory.Document.Blocks.Clear(); private void Wind
9、ow_Loaded(object sender, RoutedEventArgs e) RichTextBoxMessageHistory.Document.Blocks.Clear(); private void add20_Click(object sender, RoutedEventArgs e) addmessage(20); private void sv_richtextbox_PreviewMouseWheel(object sender, MouseWheelEventArgs e) if (e.Delta 0) isAddMessage(); private void sv
10、_richtextbox_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e) isAddMessage(); void isAddMessage() double offi = sv_richtextbox.VerticalOffset; if (offi = 0) double Maxinum = sv_richtextbox.ScrollableHeight; if (Maxinum = 0) return; vScrollposition = sv_richtextbox.ExtentHeight; addmes
11、sage(10); RichTextBoxMessageHistory.Focus(); 向RichTextBox控件追加内容,可以用Document.Blocks.Add(Block item)方法。而向RichTextBox插入内容,用的是Document.Blocks.InsertBefore(Block nextSibling, Block newItem)方法,其中nextSibling指的是将要被插入的位置,newItem指的是将要插入的新内容。而获取历史聊天记录后,我们可以用此方法往最上端插入数据。所以,此处我们可以写作RichTextBoxMessageHistory.Docu
12、ment.Blocks.InsertBefore(RichTextBoxMessageHistory.Document.Blocks.FirstBlock, pggethistoryNo);其中pggethistoryNo是新定义的内容;其实今天的主角是拖动滚动条和滚动鼠标键加载数据,而幕后的英雄是ScrollChanged事件。当我们拖动滚动条和滚动鼠标键加载出新数据时,会有一个滚动条定位的问题,有人说收到新消息时应该跳到新消息处虽新的聊天自动往下滚动,即总在最底端;有人说当你正在看历史消息时如果突然来了一条消息就跳到最底端那还得再重新找刚才的位置,让人很抓狂;还有人说当拖动加载出新消息时如
13、果滚动条呆在新加载出内容的顶端,还得再去手动找刚才读到的位置也是一件烦人眼珠子的事。能不能做一件完美的事情同时满足三者呢?有时候猜不到结局就勇敢的去做吧1、自动滚到最底部:sv_richtextbox.ScrollToEnd();2,3、定位在某位置:sv_richtextbox.ScrollToVerticalOffset(double offset);如何判断是从最上边插入的还是从最下边添加的呢?我们设置了参数isEnd来判断,true表示滚到最下端。如何判断添加新消息时滚动条是否在最下边呢?用sv_richtextbox.ScrollableHeight = sv_richtextbox.Ve
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 合同协议书 模板
- 公司棉花订购合同协议书
- 国标工程合同协议书
- 【农小蜂】2024年中国食用菌产业国际竞争优势分析报告
- 2023年彭阳县招聘城市社区专职网格员考试真题
- 泰安市泰山区社区储备人才招聘笔试真题2023
- 山东省聊城市冠县忠信学校2023-2024学年七年级上学期第二次月考生物试卷
- 2023年百色西林县住房和城乡建设局招聘考试真题
- 2025年吉林省公主岭市高三物理试题统练试题含解析
- DB345000-2013住宅区物业服务标准
- “企业安全培训课件-防范网络钓鱼攻击”
- 上海民办上宝中学英语新初一分班试卷含答案
- 小学二年级上册地方教案 全册
- 肠易激综合征中西医结合诊疗共识意见
- 第11课 认识“五谷”(说课稿)三年级下册劳动教育北京理工大学出版社
- 工业产品销售单位质量安全日管控周排查月调度制度附表
- 法院送达地址确认书(诉讼类范本)
- 管理房质量评定
- 开学安全第一课PPT课件安全教育主题班会课件PPT
- 人美版七年级美术当卢浮宫遇见紫禁城公开课一等奖课件省赛课获奖课件
- 部编版六年级语文上册第4单元大单元整体教学设计(课件配套)
评论
0/150
提交评论