WPF制作聊天窗口获取历史聊天记录_第1页
WPF制作聊天窗口获取历史聊天记录_第2页
WPF制作聊天窗口获取历史聊天记录_第3页
WPF制作聊天窗口获取历史聊天记录_第4页
WPF制作聊天窗口获取历史聊天记录_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论