From 2a3a0c5f98062f70410a30dcb770b8f704f5d6ac Mon Sep 17 00:00:00 2001 From: dathlin Date: Sat, 14 Oct 2017 21:21:33 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=B0=8F=E5=A4=B4=E5=83=8F?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=99=A8=EF=BC=8C=E4=BC=98=E5=8C=96=E6=88=91?= =?UTF-8?q?=E7=9A=84=E4=BF=A1=E6=81=AF=E5=A4=B4=E5=83=8F=E5=8A=A0=E8=BD=BD?= =?UTF-8?q?=E5=99=A8=EF=BC=8Cv1.6.13?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AccountSupport/FormAccountDetails.cs | 211 +++++++++++-- ClientsLibrary/AccountSupport/UserPortrait.cs | 292 ++++-------------- ClientsLibrary/BasicSupport/NetClientItem.cs | 31 +- ClientsLibrary/UserClient.cs | 8 +- .../ProtocolSupport/CommonProtocol.cs | 2 +- Public/HslCommunication.dll | Bin 297984 -> 299520 bytes Public/HslCommunication.xml | 79 ++++- 软件系统客户端Wpf/AppWpfHelper.cs | 35 +++ 软件系统客户端Wpf/MainWindow.xaml.cs | 82 ++--- .../Views/Controls/UserClientRenderItem.xaml.cs | 23 +- 软件系统客户端Wpf/软件系统客户端Wpf.csproj | 1 + 软件系统客户端模版/FormMainWindow.cs | 78 ++--- 12 files changed, 415 insertions(+), 427 deletions(-) create mode 100644 软件系统客户端Wpf/AppWpfHelper.cs diff --git a/ClientsLibrary/AccountSupport/FormAccountDetails.cs b/ClientsLibrary/AccountSupport/FormAccountDetails.cs index 8661242..f4a0a61 100644 --- a/ClientsLibrary/AccountSupport/FormAccountDetails.cs +++ b/ClientsLibrary/AccountSupport/FormAccountDetails.cs @@ -13,6 +13,7 @@ using HslCommunication; using HslCommunication.BasicFramework; using System.IO; using ClientsLibrary.FileSupport; +using Newtonsoft.Json.Linq; namespace ClientsLibrary { @@ -21,11 +22,10 @@ namespace ClientsLibrary #region Constructor - public FormAccountDetails(UserPortrait userPortrait) + public FormAccountDetails() { InitializeComponent(); Icon = UserClient.GetFormWindowIcon(); - UserPortrait = userPortrait; } #endregion @@ -107,47 +107,202 @@ namespace ClientsLibrary #region Load Portrait - public UserPortrait UserPortrait { get; } - - + + private void pictureBox_UserPortrait_Click(object sender, EventArgs e) { - UserPortrait.ChangePortrait(LoadLargeProtrait,UnloadLargeProtrait); + // UserPortrait.ChangePortrait(LoadLargeProtrait,UnloadLargeProtrait); + using (FormPortraitSelect fps = new FormPortraitSelect()) + { + if (fps.ShowDialog() == DialogResult.OK) + { + string FileSavePath = Application.StartupPath + @"\Portrait\" + UserClient.UserAccount.UserName; + + string path300 = FileSavePath + @"\" + PortraitSupport.LargePortrait; + string path32 = FileSavePath + @"\" + PortraitSupport.SmallPortrait; + + + Bitmap bitmap300 = fps.GetSpecifiedSizeImage(300); + Bitmap bitmap32 = fps.GetSpecifiedSizeImage(32); + + try + { + bitmap300.Save(path300, System.Drawing.Imaging.ImageFormat.Png); + bitmap32.Save(path32, System.Drawing.Imaging.ImageFormat.Png); + bitmap32.Dispose(); + bitmap300.Dispose(); + } + catch (Exception ex) + { + // 文件被占用的时候无法进行覆盖 + UserClient.LogNet?.WriteException("头像保存失败!", ex); + MessageBox.Show("头像保存失败,原因:" + ex.Message); + + // 加载回旧的文件 + pictureBox_UserPortrait.Load(path300); + return; + } + + + // 传送服务器 + using (FormFileOperate ffo = new FormFileOperate( + UserClient.Net_File_Client, + new string[] + { + path300, + path32 + }, "Files", "Portrait", UserClient.UserAccount.UserName)) + { + ffo.ShowDialog(); + } + + ThreadPool.QueueUserWorkItem(new WaitCallback(obj => + { + // 上传文件MD5码 + string SmallPortraitMD5 = ""; + string LargePortraitMD5 = ""; + + try + { + SmallPortraitMD5 = SoftBasic.CalculateFileMD5(path32); + LargePortraitMD5 = SoftBasic.CalculateFileMD5(path300); + } + catch (Exception ex) + { + UserClient.LogNet.WriteException("获取文件MD5码失败:", ex); + MessageBox.Show("文件信息确认失败,请重新上传!"); + return; + } + + JObject json = new JObject + { + { UserAccount.UserNameText, new JValue(UserClient.UserAccount.UserName) }, + { UserAccount.SmallPortraitText, new JValue(SmallPortraitMD5) }, + { UserAccount.LargePortraitText, new JValue(LargePortraitMD5) } + }; + + + OperateResultString result = UserClient.Net_simplify_client.ReadFromServer( + CommonHeadCode.SimplifyHeadCode.上传头像MD5, + json.ToString()); + + if (result.IsSuccess) + { + if (result.Content.Substring(0, 2) == "成功") + { + UserClient.UserAccount.SmallPortraitMD5 = SmallPortraitMD5; + UserClient.UserAccount.LargePortraitMD5 = LargePortraitMD5; + } + else + { + MessageBox.Show("上传头像失败!原因:" + result.Content); + } + } + else + { + MessageBox.Show("上传头像失败!原因:" + result.Message); + } + + // 先显示信息 + try + { + pictureBox_UserPortrait.Image = new Bitmap(new System.IO.MemoryStream(File.ReadAllBytes(path300))); + } + catch + { + + } + }), + null + ); + } + + } } private void ThreadPoolLoadLargePortrait(object obj) { - Thread.Sleep(200); - UserPortrait.LoadUserLargePortraint(LoadLargeProtrait, UnloadLargeProtrait); - } - - private void UnloadLargeProtrait() - { - if (IsHandleCreated && InvokeRequired) + // 先获取服务器端的MD5码 + string fileServerMd5 = UserClient.UserAccount.LargePortraitMD5; + if (string.IsNullOrEmpty(fileServerMd5)) { - BeginInvoke(new Action(() => - { - UnloadLargeProtrait(); - })); - return; + return; // 没有文件 } - pictureBox_UserPortrait.Image = null; - } - - private void LoadLargeProtrait(string fileName) - { - if (IsHandleCreated && InvokeRequired) + string fileName = Application.StartupPath + @"\Portrait\" + UserClient.UserAccount.UserName + @"\" + PortraitSupport.LargePortrait; + if(File.Exists(fileName)) { - BeginInvoke(new Action(() => + bool loadSuccess = false; + Invoke(new Action(() => { - LoadLargeProtrait(fileName); + try + { + pictureBox_UserPortrait.Image = new Bitmap(new MemoryStream(File.ReadAllBytes(fileName))); + loadSuccess = true; + } + catch + { + + } })); - return; + + if (!loadSuccess) goto P1; // 加载不成功,直接重新下载 + + // 计算md5 + string md5 = string.Empty; + + try + { + md5 = SoftBasic.CalculateFileMD5(fileName); + } + catch + { + + } + + if(md5 == UserClient.UserAccount.LargePortraitMD5) + { + return; + } + } + + P1: + MemoryStream ms = new MemoryStream(); + OperateResult result = UserClient.Net_File_Client.DownloadFile( + PortraitSupport.LargePortrait, + "Files", + "Portrait", + UserClient.UserAccount.UserName, + null, + ms + ); + + if(result.IsSuccess) + { + if(IsHandleCreated) Invoke(new Action(() => + { + // 下载完成 + Bitmap bitmap = new Bitmap(ms); + pictureBox_UserPortrait.Image = bitmap; + + try + { + bitmap.Save(fileName); + } + catch + { + + } + })); + } + else + { + // 下载异常,丢弃 } - pictureBox_UserPortrait.ImageLocation = fileName; + ms.Dispose(); } + #endregion diff --git a/ClientsLibrary/AccountSupport/UserPortrait.cs b/ClientsLibrary/AccountSupport/UserPortrait.cs index 147a8b6..468f6f7 100644 --- a/ClientsLibrary/AccountSupport/UserPortrait.cs +++ b/ClientsLibrary/AccountSupport/UserPortrait.cs @@ -26,7 +26,7 @@ namespace ClientsLibrary /// - /// 头像管理类 + /// 头像管理器,负责所有小头像数据的缓存 /// public class UserPortrait { @@ -37,7 +37,7 @@ namespace ClientsLibrary /// /// 头像存储的文件夹路径 /// 加载头像的委托 - public UserPortrait(string filePath, Action loadPicSmall) + public UserPortrait(string filePath) { if (!System.IO.Directory.Exists(filePath)) { @@ -45,229 +45,10 @@ namespace ClientsLibrary } FileSavePath = filePath; - m_LoadPicSmall = loadPicSmall; } #endregion - #region Change Portrait - - /// - /// 点击更改头像后的操作,打开头像选择对话框,获取到2种分辨率的头像,然后进行上传 - /// - /// 加载大头像的委托 - /// 卸载大头像的委托 - public void ChangePortrait(Action loadPic, Action unloadPic) - { - using (FormPortraitSelect fps = new FormPortraitSelect()) - { - if (fps.ShowDialog() == DialogResult.OK) - { - string path300 = FileSavePath + @"\" + PortraitSupport.LargePortrait; - string path32 = FileSavePath + @"\" + PortraitSupport.SmallPortrait; - - // 先卸载图片 - unloadPic?.Invoke(); - - Bitmap bitmap300 = fps.GetSpecifiedSizeImage(300); - Bitmap bitmap32 = fps.GetSpecifiedSizeImage(32); - - try - { - bitmap300.Save(path300); - bitmap32.Save(path32); - bitmap32.Dispose(); - bitmap300.Dispose(); - } - catch(Exception ex) - { - // 文件被占用的时候无法进行覆盖 - UserClient.LogNet?.WriteException("头像保存失败!", ex); - MessageBox.Show("头像保存失败,原因:" + ex.Message); - - // 加载回旧的文件 - loadPic?.Invoke(path300); - return; - } - - - // 传送服务器 - - using (FormFileOperate ffo = new FormFileOperate( - UserClient.Net_File_Client, - new string[] - { - path300, - path32 - }, "Files", "Portrait", UserClient.UserAccount.UserName)) - { - ffo.ShowDialog(); - } - - ThreadPool.QueueUserWorkItem(new WaitCallback(obj => - { - // 上传文件MD5码 - string SmallPortraitMD5 = ""; - string LargePortraitMD5 = ""; - - try - { - SmallPortraitMD5 = SoftBasic.CalculateFileMD5(path32); - LargePortraitMD5 = SoftBasic.CalculateFileMD5(path300); - } - catch(Exception ex) - { - UserClient.LogNet.WriteException("获取文件MD5码失败:", ex); - MessageBox.Show("文件信息确认失败,请重新上传!"); - return; - } - - JObject json = new JObject - { - { UserAccount.UserNameText, new JValue(UserClient.UserAccount.UserName) }, - { UserAccount.SmallPortraitText, new JValue(SmallPortraitMD5) }, - { UserAccount.LargePortraitText, new JValue(LargePortraitMD5) } - }; - - - OperateResultString result = UserClient.Net_simplify_client.ReadFromServer( - CommonHeadCode.SimplifyHeadCode.上传头像MD5, - json.ToString()); - - if (result.IsSuccess) - { - if (result.Content.Substring(0, 2) == "成功") - { - UserClient.UserAccount.SmallPortraitMD5 = SmallPortraitMD5; - UserClient.UserAccount.LargePortraitMD5 = LargePortraitMD5; - } - else - { - MessageBox.Show("上传头像失败!原因:" + result.Content); - } - } - else - { - MessageBox.Show("上传头像失败!原因:" + result.Message); - } - - // 先显示信息 - loadPic?.Invoke(path300); - LoadUserSmallPortraint(); - }), null); - - } - - } - } - - - #endregion - - #region Load Portraint - - public static Bitmap DownloadSmallPortraint(string userName) - { - Bitmap bitmap = null; - - System.IO.MemoryStream ms = new System.IO.MemoryStream(); - - OperateResult result = UserClient.Net_File_Client.DownloadFile( - PortraitSupport.SmallPortrait, - "Files", - "Portrait", - userName, - null, - ms - ); - if (result.IsSuccess) - { - bitmap = new Bitmap(ms); - } - else - { - bitmap = Properties.Resources.person_1; - } - - ms.Dispose(); - - return bitmap; - } - - /// - /// 加载小尺寸的头像操作,需要放置到线程池中 - /// - public void LoadUserSmallPortraint() - { - m_LoadPicSmall?.Invoke(DownloadSmallPortraint(UserClient.UserAccount.UserName)); - } - - - /// - /// 加载大尺寸的头像方法,需要放到线程池中操作 - /// - /// - public void LoadUserLargePortraint(Action largeLoadAction, Action largeUnloadAction) - { - // 先获取服务器端的MD5码 - string fileMd5 = UserClient.UserAccount.LargePortraitMD5; - if (string.IsNullOrEmpty(fileMd5)) - { - // 服务器端没有文件,加载结束 - return; - } - - // 获取本地MD5 - string fileName = FileSavePath + @"\" + PortraitSupport.LargePortrait; - if (System.IO.File.Exists(fileName)) - { - // 本地存在文件,先进行加载,如果运算不一致,再重新加载 - largeLoadAction?.Invoke(fileName); - string currentMd5 = null; - - - try - { - currentMd5 = SoftBasic.CalculateFileMD5(fileName); - } - catch(Exception ex) - { - MessageBox.Show("计算文件MD5码错误:" + ex.Message); - return; - } - - // 对比验证 - if (fileMd5 == currentMd5) - { - return; - } - } - - largeUnloadAction?.Invoke(); - - // 本地不存在文件或校验失败,需要重新下载 - OperateResult result = UserClient.Net_File_Client.DownloadFile(PortraitSupport.LargePortrait, - "Files", - "Portrait", - UserClient.UserAccount.UserName, - null, - fileName); - - if (result.IsSuccess) - { - // 下载成功 - largeLoadAction?.Invoke(fileName); - } - else - { - MessageBox.Show("头像从服务器下载失败,错误原因:" + result.Message); - } - - - } - - #endregion - #region Download Portraint @@ -323,19 +104,62 @@ namespace ClientsLibrary #endregion - #region Public Method - /// - /// - /// - /// - public string GetLargePortraitFileName() + #region Pricvate Method + + private void SetSmallPortrait(string name,Bitmap bitmap) { - return FileSavePath + @"\" + PortraitSupport.LargePortrait; + hybirdLock.Enter(); + + if(dictSmallPortrait.ContainsKey(name)) + { + dictSmallPortrait[name] = bitmap; + } + else + { + dictSmallPortrait.Add(name, bitmap); + } + + hybirdLock.Leave(); } - public string GetSmallPortraitFileName() + private Bitmap DownloadSmallPortraitByName(string name) { - return FileSavePath + @"\" + PortraitSupport.SmallPortrait; + OperateResult result = UserClient.Net_File_Client.DownloadFile( + PortraitSupport.SmallPortrait, + "Files", + "Portrait", + name, + null, + out Bitmap bitmap); + if (result.IsSuccess) + { + SetSmallPortrait(name, bitmap); + return bitmap; + } + else + { + return Properties.Resources.person_1; + } + } + + public void UpdateSmallPortraitByName(string name) + { + DownloadSmallPortraitByName(name); + } + + public Bitmap GetSmallPortraitByUserName(string name) + { + Bitmap bitmap = null; + hybirdLock.Enter(); + if (dictSmallPortrait.ContainsKey(name)) + { + bitmap = dictSmallPortrait[name]; + } + hybirdLock.Leave(); + + if (bitmap != null) return bitmap; + + return DownloadSmallPortraitByName(name); } #endregion @@ -346,11 +170,9 @@ namespace ClientsLibrary /// 文件的路径 /// private string FileSavePath { get; set; } - - /// - /// 加载小头像的委托 - /// - private Action m_LoadPicSmall { get; set; } + + private Dictionary dictSmallPortrait = new Dictionary(); + private SimpleHybirdLock hybirdLock = new SimpleHybirdLock(); #endregion } diff --git a/ClientsLibrary/BasicSupport/NetClientItem.cs b/ClientsLibrary/BasicSupport/NetClientItem.cs index e3b26e8..87cab20 100644 --- a/ClientsLibrary/BasicSupport/NetClientItem.cs +++ b/ClientsLibrary/BasicSupport/NetClientItem.cs @@ -77,33 +77,14 @@ namespace ClientsLibrary.BasicSupport // 向服务器请求小头像 if (m_NetAccount != null) { - try - { - System.IO.MemoryStream ms = new System.IO.MemoryStream(); + Bitmap bitmap = UserClient.PortraitManager.GetSmallPortraitByUserName(m_NetAccount.UserName); - HslCommunication.OperateResult result = UserClient.Net_File_Client.DownloadFile( - PortraitSupport.SmallPortrait, - "Files", - "Portrait", - m_NetAccount.UserName, - null, - ms - ); - if (result.IsSuccess) - { - Bitmap bitmap = new Bitmap(ms); - pictureBox1.Image = bitmap; - } - else - { - // 可能网络错误,也可能因为服务器没有头像 - // MessageBox.Show(result.Message); - pictureBox1.Image = Properties.Resources.person_1; - } - } - catch (Exception ex) + if(IsHandleCreated) { - MessageBox.Show(ex.Message); + Invoke(new Action(() => + { + pictureBox1.Image = bitmap; + })); } } } diff --git a/ClientsLibrary/UserClient.cs b/ClientsLibrary/UserClient.cs index efe7644..0b7c2b7 100644 --- a/ClientsLibrary/UserClient.cs +++ b/ClientsLibrary/UserClient.cs @@ -36,7 +36,7 @@ namespace ClientsLibrary /// /// 本软件的当前版本,用来验证更新的关键依据 /// - public static SystemVersion CurrentVersion { get; } = new SystemVersion("1.0.0.171013"); + public static SystemVersion CurrentVersion { get; } = new SystemVersion("1.0.0.171014"); /// @@ -133,8 +133,10 @@ namespace ClientsLibrary return false; } - - + /// + /// 头像管理器 + /// + public static UserPortrait PortraitManager { get; set; } diff --git a/CommonLibrary/ProtocolSupport/CommonProtocol.cs b/CommonLibrary/ProtocolSupport/CommonProtocol.cs index 40c472c..c981d0e 100644 --- a/CommonLibrary/ProtocolSupport/CommonProtocol.cs +++ b/CommonLibrary/ProtocolSupport/CommonProtocol.cs @@ -45,7 +45,7 @@ namespace CommonLibrary * **************************************************************************/ - SoftBasic.FrameworkVersion = new SystemVersion("1.6.12"); + SoftBasic.FrameworkVersion = new SystemVersion("1.6.13"); } diff --git a/Public/HslCommunication.dll b/Public/HslCommunication.dll index 60a691de06e670c7d95ee845ba78b59cf52a26e6..923d5ac9dcc7e0a6712fd9b23ea7fde429b1c7c1 100644 GIT binary patch delta 93739 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 delta 92671 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 diff --git a/Public/HslCommunication.xml b/Public/HslCommunication.xml index 69a88e7..008c2f7 100644 --- a/Public/HslCommunication.xml +++ b/Public/HslCommunication.xml @@ -706,6 +706,20 @@ + + + 获取数据流的md5码 + + 数据流,可以是内存流,也可以是文件流 + + + + + 获取内存图片的md5码 + + 内存图片 + + 从一个字节大小返回带单位的描述 @@ -2147,23 +2161,23 @@ - + - 基础下载文件信息 + 基础下载信息 服务器的文件名称 下载的进度报告 - 本地保存的文件名称,包含完整路径名 + 数据源信息,决定最终存储到哪里去 - + 上传文件给服务器 - 本地完整路径的文件名 + 数据源,可以是文件名,也可以是数据流 在服务器保存的文件名,不包含驱动器路径 @@ -2212,6 +2226,18 @@ 流数据 + + + 下载服务器的文件到本地的数据流中 + + 文件名称,带后缀 + 第一大类 + 第二大类 + 第三大类 + 下载的进度报告 + 内存文件 + + 上传本地的文件到服务器操作 @@ -2226,6 +2252,35 @@ 上传的进度报告 + + + 上传数据流到服务器操作 + + 数据流内容 + 服务器存储的文件名称,带后缀 + 第一大类 + 第二大类 + 第三大类 + 文件的额外描述 + 文件的上传人 + 上传的进度报告 + + + + + 上传内存图片到服务器操作 + + 内存图片,不能为空 + 服务器存储的文件名称,带后缀 + 第一大类 + 第二大类 + 第三大类 + 文件的额外描述 + 文件的上传人 + 上传的进度报告 + + + 根据三种分类信息,还原成在服务器的相对路径,包含文件 @@ -3900,6 +3955,20 @@ + + + [自校验] 将流数据发送至套接字,具体发送细节将在继承类中实现,如果结果异常,则结束通讯 + + 套接字 + 文件名称,文件必须存在 + 远程端的文件名称 + 文件的额外标签 + 文件的上传人 + 操作结果对象 + 发送进度报告 + + + [自校验] 接收一条完整的同步数据,包含头子节和内容字节,基础的数据,如果结果异常,则结束通讯 diff --git a/软件系统客户端Wpf/AppWpfHelper.cs b/软件系统客户端Wpf/AppWpfHelper.cs new file mode 100644 index 0000000..314a013 --- /dev/null +++ b/软件系统客户端Wpf/AppWpfHelper.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Media.Imaging; + +namespace 软件系统客户端Wpf +{ + + + /*********************************************************************************** + * + * 说明:用于开发一些wpf专有的方法,一些转换方法 + * + ***********************************************************************************/ + + + + public class AppWpfHelper + { + public static BitmapImage TranslateImageToBitmapImage(System.Drawing.Bitmap bitmap) + { + System.IO.MemoryStream ms = new System.IO.MemoryStream(); + if(bitmap.RawFormat != null) bitmap.Save(ms, bitmap.RawFormat); + else bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp); + BitmapImage bi = new BitmapImage(); + bi.BeginInit(); + bi.StreamSource = ms; + bi.EndInit(); + return bi; + } + + } +} diff --git a/软件系统客户端Wpf/MainWindow.xaml.cs b/软件系统客户端Wpf/MainWindow.xaml.cs index 40a5a33..acf1420 100644 --- a/软件系统客户端Wpf/MainWindow.xaml.cs +++ b/软件系统客户端Wpf/MainWindow.xaml.cs @@ -70,6 +70,8 @@ namespace 软件系统客户端Wpf public MainWindow() { InitializeComponent(); + + UserClient.PortraitManager = new UserPortrait(AppDomain.CurrentDomain.BaseDirectory); } #endregion @@ -112,10 +114,10 @@ namespace 软件系统客户端Wpf //窗口显示 IsWindowShow = true; - //udp测试 - //SendServerUdpData(0, "显示了窗体"); + // udp测试 + // SendServerUdpData(0, "显示了窗体"); - //是否显示更新日志,显示前进行判断该版本是否已经显示过了 + // 是否显示更新日志,显示前进行判断该版本是否已经显示过了 if (!UserClient.JsonSettings.IsNewVersionRunning) { UserClient.JsonSettings.IsNewVersionRunning = false; @@ -126,7 +128,7 @@ namespace 软件系统客户端Wpf - //根据权限使能菜单 + // 根据权限使能菜单 if(UserClient.UserAccount.Grade < AccountGrade.Admin) { MenuItem公告管理.IsEnabled = false; @@ -145,15 +147,15 @@ namespace 软件系统客户端Wpf } - //启动网络服务 + // 启动网络服务 Net_Socket_Client_Initialization(); - //启动定时器 + // 启动定时器 TimeTickInitilization(); - //显示头像 - SoftUserPortraitInitialization(); - SoftUserPortrait.LoadUserSmallPortraint(); + // 显示名称和加载头像 AccountChip.Content = UserClient.UserAccount.UserName; + AccountPortrait.Source = AppWpfHelper.TranslateImageToBitmapImage( + UserClient.PortraitManager.GetSmallPortraitByUserName(UserClient.UserAccount.UserName)); SetShowRenderControl(UIControl_Home); } @@ -328,7 +330,7 @@ namespace 软件系统客户端Wpf private void MenuItem我的信息_Click(object sender, RoutedEventArgs e) { - using (FormAccountDetails form = new FormAccountDetails(SoftUserPortrait)) + using (FormAccountDetails form = new FormAccountDetails()) { form.ShowDialog(); } @@ -403,8 +405,17 @@ namespace 软件系统客户端Wpf } } + private void AccountChip_Click(object sender, RoutedEventArgs e) + { + // 点击了头像,请求查看高清版本头像 + using (FormMatterRemind fmr = new FormMatterRemind("正在下载图片", UserClient.PortraitManager.ThreadPoolDownloadSizeLarge)) + { + fmr.ShowDialog(); + } + } + #endregion - + #region 异步网络块 private NetComplexClient net_socket_client = new NetComplexClient(); @@ -544,8 +555,14 @@ namespace 软件系统客户端Wpf } else if(customer == CommonHeadCode.MultiNetHeadCode.新头像更新) { + UserClient.PortraitManager.UpdateSmallPortraitByName(data); if (IsWindowShow) Dispatcher.Invoke(new Action(() => { + if (data == UserClient.UserAccount.UserName) + { + AccountPortrait.Source = AppWpfHelper.TranslateImageToBitmapImage( + UserClient.PortraitManager.GetSmallPortraitByUserName(data)); + } foreach (Views.Controls.UserClientRenderItem m in ClientsOnline.Children) { m.UpdatePortrait(data); @@ -694,50 +711,7 @@ namespace 软件系统客户端Wpf } #endregion - - #region 头像图片上传下载块 - - - private UserPortrait SoftUserPortrait { get; set; } - - private void SoftUserPortraitInitialization() - { - SoftUserPortrait = new UserPortrait(AppDomain.CurrentDomain.BaseDirectory + - @"Portrait\" + UserClient.UserAccount.UserName, ShowSmallPortrait); - } - - private void ShowSmallPortrait(System.Drawing.Bitmap bitmap) - { - if (IsWindowShow) Dispatcher.Invoke(new Action(() => - { - MemoryStream ms = new MemoryStream(); - bitmap.Save(ms, bitmap.RawFormat); - bitmap.Dispose(); - - BitmapImage bi = new BitmapImage(); - bi.BeginInit(); - bi.StreamSource = ms; - bi.EndInit(); - - AccountPortrait.Source = bi; - })); - } - - - - private void AccountChip_Click(object sender, RoutedEventArgs e) - { - // 点击了头像,请求查看高清版本头像 - using (FormMatterRemind fmr = new FormMatterRemind("正在下载图片", SoftUserPortrait.ThreadPoolDownloadSizeLarge)) - { - fmr.ShowDialog(); - } - } - - - #endregion - #region 多界面管理块 private List all_main_render = new List(); diff --git a/软件系统客户端Wpf/Views/Controls/UserClientRenderItem.xaml.cs b/软件系统客户端Wpf/Views/Controls/UserClientRenderItem.xaml.cs index 83dc67f..805c576 100644 --- a/软件系统客户端Wpf/Views/Controls/UserClientRenderItem.xaml.cs +++ b/软件系统客户端Wpf/Views/Controls/UserClientRenderItem.xaml.cs @@ -100,26 +100,11 @@ namespace 软件系统客户端Wpf.Views.Controls // 向服务器请求小头像 if (obj is NetAccount m_NetAccount) { - try + System.Drawing.Bitmap bitmap = UserClient.PortraitManager.GetSmallPortraitByUserName(m_NetAccount.UserName); + Dispatcher.Invoke(new Action(() => { - System.Drawing.Bitmap bitmap = UserPortrait.DownloadSmallPortraint(m_NetAccount.UserName); - MemoryStream ms = new MemoryStream(); - bitmap.Save(ms, bitmap.RawFormat); - bitmap.Dispose(); - - Dispatcher.Invoke(new Action(() => - { - BitmapImage bi = new BitmapImage(); - bi.BeginInit(); - bi.StreamSource = ms; - bi.EndInit(); - Image1.Source = bi; - })); - } - catch (Exception ex) - { - UserClient.LogNet?.WriteException("Thread Download Portrait Failed", ex); - } + Image1.Source = AppWpfHelper.TranslateImageToBitmapImage(bitmap); + })); } } diff --git a/软件系统客户端Wpf/软件系统客户端Wpf.csproj b/软件系统客户端Wpf/软件系统客户端Wpf.csproj index fbd331c..10bd162 100644 --- a/软件系统客户端Wpf/软件系统客户端Wpf.csproj +++ b/软件系统客户端Wpf/软件系统客户端Wpf.csproj @@ -74,6 +74,7 @@ MSBuild:Compile Designer + UserClientRenderItem.xaml diff --git a/软件系统客户端模版/FormMainWindow.cs b/软件系统客户端模版/FormMainWindow.cs index 0ac9ba2..1140e69 100644 --- a/软件系统客户端模版/FormMainWindow.cs +++ b/软件系统客户端模版/FormMainWindow.cs @@ -58,6 +58,9 @@ namespace 软件系统客户端模版 InitializeComponent(); Icon = UserClient.GetFormWindowIcon(); + + // 初始化头像管理器 + UserClient.PortraitManager = new UserPortrait(Application.StartupPath + @"\Portrait\" + UserClient.UserAccount.UserName); } #endregion @@ -139,12 +142,12 @@ namespace 软件系统客户端模版 // 启动网络服务 Net_Socket_Client_Initialization(); - // 启动头像 - SoftUserPortraitInitialization(); // 启动定时器 TimeTickInitilization(); + + // 显示头像 - SoftUserPortrait.LoadUserSmallPortraint(); + pictureBox1.Image = UserClient.PortraitManager.GetSmallPortraitByUserName(UserClient.UserAccount.UserName); } private void FormMainWindow_FormClosing(object sender, FormClosingEventArgs e) { @@ -327,7 +330,7 @@ namespace 软件系统客户端模版 private void 我的信息ToolStripMenuItem_Click(object sender, EventArgs e) { - using (FormAccountDetails form = new FormAccountDetails(SoftUserPortrait)) + using (FormAccountDetails form = new FormAccountDetails()) { form.ShowDialog(); } @@ -349,6 +352,15 @@ namespace 软件系统客户端模版 } } + private void pictureBox1_Click(object sender, EventArgs e) + { + //点击了头像,请求下载高清版本头像 + using (FormMatterRemind fmr = new FormMatterRemind("正在下载图片", UserClient.PortraitManager.ThreadPoolDownloadSizeLarge)) + { + fmr.ShowDialog(); + } + } + #endregion #region 异步网络块 @@ -468,8 +480,13 @@ namespace 软件系统客户端模版 } else if(customer == CommonHeadCode.MultiNetHeadCode.新头像更新) { + UserClient.PortraitManager.UpdateSmallPortraitByName(data); if (IsHandleCreated) Invoke(new Action(() => { + if(data == UserClient.UserAccount.UserName) + { + pictureBox1.Image = UserClient.PortraitManager.GetSmallPortraitByUserName(data); + } netClientOnline1.ClientUpdatePortrait(data); })); } @@ -724,59 +741,6 @@ namespace 软件系统客户端模版 - #endregion - - #region 头像图片上传下载块 - - - private UserPortrait SoftUserPortrait { get; set; } - - private void SoftUserPortraitInitialization() - { - SoftUserPortrait = new UserPortrait(Application.StartupPath + - @"\Portrait\" + UserClient.UserAccount.UserName, LoadSmallProtraitAsync); - } - - - private void LoadSmallProtraitAsync(Bitmap bitmap) - { - if (IsHandleCreated && InvokeRequired) - { - Invoke(new Action(() => - { - LoadSmallProtraitAsync(bitmap); - })); - return; - } - - pictureBox1.Image = bitmap; - } - - private void UnloadSmallProtrait() - { - if (IsHandleCreated && InvokeRequired) - { - Invoke(new Action(() => - { - UnloadSmallProtrait(); - })); - return; - } - - pictureBox1.Image = null; - } - - private void pictureBox1_Click(object sender, EventArgs e) - { - //点击了头像,请求下载高清版本头像 - using (FormMatterRemind fmr = new FormMatterRemind("正在下载图片", SoftUserPortrait.ThreadPoolDownloadSizeLarge)) - { - fmr.ShowDialog(); - } - } - - - #endregion