1、在Login.xaml中添加资源:

  1. <XmlDataProvider x:Key="XmlDataProvider" Source="pack://application:,,,/5yue.PMS;Component/Config/SysConfig.xml" XPath="SysConfig"/>

2、使用ComboBox实现帐号输入:

  1. <ComboBox x:Name="UserName" Width="160" Height="26" FontSize="14" IsEditable="True" Grid.Row="1" Grid.Column="1"
  2. ItemsSource="{Binding Source={StaticResource XmlDataProvider}, XPath=SavedLoginNames/LoginName}" BorderThickness ="1" SelectedIndex="0"/>
  3. <CheckBox x:Name="ckSaveName" FontSize="12px" Grid.Row="1" Grid.Column="2" HorizontalAlignment="Right" Margin="0,0,22,0" Padding="2 0 " Foreground="#88052742">记住我</CheckBox>

3、后台逻辑,在提交验证成功后添加保存帐号的步骤即可:

  1. /// <summary>
  2. /// 保存账号(异步执行)
  3. /// </summary>
  4. /// <param name="loginName"></param>
  5. private async void SaveLoginName(string loginName)
  6. {
  7. await Task.Delay();
  8. if(this.ckSaveName.IsChecked != true) return;
  9. try
  10. {
  11. string filePath = Utils.GetMapPath("")+@"Config\SysConfig.xml";
  12. XmlDocument doc = XmlHelper.GetXMLDoc(filePath);
  13. if (doc != null)
  14. {
  15. XmlNode rootNode = doc.SelectSingleNode("SysConfig");
  16. List<string> nameList = XmlHelper.GetNodesToList(rootNode, "SavedLoginNames");
  17. if (nameList != null && !nameList.Contains(loginName))// 如果账号仍未保存
  18. {
  19. XmlNode namesNode = rootNode.SelectSingleNode("SavedLoginNames");// 获取SavedLoginNames节点信息
  20. XmlNode childNode = doc.CreateElement("LoginName");// 创建新的SavedLoginName节点
  21. childNode.InnerText = loginName;// 节点内容值为loginName参数
  22. namesNode.PrependChild(childNode);// 插入到最前
  23.  
  24. int maxCount = Utils.StrToInt(CacheProvider.GetSysConfig("SavedLoginNameCount"), );
  25. namesNode = XmlHelper.HandleNodeUnderMaxCount(namesNode, maxCount);// 处理保存账号的最大数量大于config表中配置的数量
  26. doc.Save(filePath);// 保存
  27. }
  28. else if (nameList != null && nameList.Contains(loginName))// 如果账号已保存, 将其提到最前。
  29. {
  30. if (nameList.Count == ) return;
  31. XmlNode namesNode = rootNode.SelectSingleNode("SavedLoginNames");
  32. XmlNodeList childNodes = namesNode.ChildNodes;
  33. foreach (XmlNode item in childNodes)
  34. {
  35. if (loginName.Equals(item.InnerText))
  36. {
  37. XmlNode newNode = item;
  38. namesNode.RemoveChild(item);
  39. namesNode.PrependChild(newNode);
  40. break;
  41. }
  42. }
  43. doc.Save(filePath);// 保存
  44. }
  45. //else if(nameList == null) return "failed,读取配置失败!";
  46. }
  47. //return (int)Message.SUCCESS;
  48. }
  49. catch (Exception ex)
  50. {
  51. //return ex.ToString();
  52. }
  53. }

4、项目根目录/Config下添加SysConfig.xml保存用户名

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <SysConfig>
  3. <SavedLoginNames><!-- 保存的登录账号 -->
  4. <LoginName>admin</LoginName>
  5. <LoginName>111</LoginName>
  6. <LoginName>555</LoginName>
  7. <LoginName>22</LoginName>
  8. <LoginName>444</LoginName>
  9. </SavedLoginNames>
  10. </SysConfig>

效果如图:

WPF中实现登陆窗口的“记住帐号”功能的更多相关文章

  1. 如何监视 WPF 中的所有窗口,在所有窗口中订阅事件或者附加 UI

    原文:如何监视 WPF 中的所有窗口,在所有窗口中订阅事件或者附加 UI 由于 WPF 路由事件(主要是隧道和冒泡)的存在,我们很容易能够通过只监听窗口中的某些事件使得整个窗口中所有控件发生的事件都被 ...

  2. TortoiseGit bonobo gitserver记住帐号密码

    记住帐号密码有两种方式: 针对服务器存储用户名密码 设置方式为在windows用户存储位置创建文件_netrc,没有后缀名.用文本编辑内容,格式为   machine 115.29.141.162 只 ...

  3. js COOKIE 记住帐号或者uuid

    当开始接到这个任务的时候,我对cookie还是没多少了解的,而uuid的生成也是一无所知.但是当你发现这个网址http://stackoverflow.com/questions/105034/how ...

  4. WPF中使用AxisAngleRotation3D实现CAD的2D旋转功能

    原文:WPF中使用AxisAngleRotation3D实现CAD的2D旋转功能       对于CAD图形来说,3D旋转比较常用,具体实现方法在上篇文章<WPF中3D旋转的实现 >中做了 ...

  5. 【.net 深呼吸】WPF 中的父子窗口

    与 WinForm 不同,WPF 并没有 MDI 窗口,但 WPF 的窗口之间是可以存在“父子”关系的. 我们会发现,Window 类公开了一个属性叫 Owner,这个属性是可读可写的,从名字上我们也 ...

  6. TortoiseGit + msysgit 记住帐号密码方法及使用密匙的方法

    Windows 重度用户只能用 for windows 的软件了,所以虽然使用 Git,但还是要找专门的 windows 版本. 最近开始使用 GitHub 来托管一些小项目/兴趣,而自己是重度 wi ...

  7. java在线聊天项目 客户端登陆窗口LoginDialog的注册用户功能 修改注册逻辑 增空用户名密码的反馈 增加showMessageDialog()提示框

    LoginDialog类的代码修改如下: package com.swift.frame; import java.awt.EventQueue; import java.awt.event.Acti ...

  8. WPF中两个窗口的互斥

    这里所讲的互斥是两个窗口不同时存在,打开一,只显示一:点一相关按钮显示二,关闭一:关闭二,显示一. 窗口一: history winResult winChoice = new winResult() ...

  9. c#中实现登陆窗口(无需隐藏)

    C#登录窗口的实现,特点就是不用隐藏. 在入口处打开登陆: static void Main() { Application.EnableVisualStyles(); Application.Set ...

随机推荐

  1. 浅述WinForm多线程编程与Control.Invoke的应用

    VS2008.C#3.0在WinForm开发中,我们通常不希望当窗体上点了某个按钮执行某个业务的时候,窗体就被卡死了,直到该业务执行完毕后才缓过来.一个最直接的方法便是使用多线程.多线程编程的方式在W ...

  2. MySql中文乱码

    [mysqld]## UTF 8 Settings#init-connect=\'SET NAMES utf8\'collation_server=utf8_unicode_cicharacter_s ...

  3. JS倒计时功能,给定时间返回规定格式倒计时时间

    重写了一下,增强了通用性,重写时发现月份和年份计算很复杂,因为月份天数不一样,年份又涉及平年闰年; 本人数学实在不佳无法写出算法,哪位大大日后写出来了分享给小弟一份,谢谢~. <!doctype ...

  4. ArcGIS10.1 发布气温插值GP服务

    首先通过ModelBuilder 工具 构建模型 然后通过模块右键 设置输入参数 或者直接将一个模块设为输入参数 在输出模块的右键属性上 可以设置lyr文件用于渲染 设置数据添加到显示用于不是发布的时 ...

  5. 自定义CollectionViewLayout

    转自answer-huang的博客 原文出自:Custom Collection View Layouts    UICollectionView在iOS6中第一次被介绍,也是UIKit视图类中的一颗 ...

  6. ssh 配置config 别名

    打开shell 当前用户 cd ~ cd .ssh vim config Host (别名) User root(git)   登陆远程shell的用户 HostName 10.0.0.1 ip地址 ...

  7. nodejs笔记

    “多读书多看报,少看视频多睡觉.”在2015年即将结束之际,我把这句话作为我2016年的个人签名,希望它能时刻提醒我自己应该去好好读书,查漏补缺,充实自己,遇到不清楚的漏洞就努力去弄懂弄通. 在web ...

  8. nginx expires

    配置expiresexpires起到控制页面缓存的作用,合理的配置expires可以减少很多服务器的请求要配置expires,可以在http段中或者server段中或者location段中加入   1 ...

  9. Socket TCP之keepalive

    摘自: http://machael.blog.51cto.com/829462/211989/

  10. div+css 设计下拉

    css样式 <style type="text/css"> <!-- /* www.divcss5.com CSS下拉菜单实例 */ * { margin:; p ...