最近做WPF项目有一个需要记住账号密码的操作,第一反应像这种记住账号密码的应该可以保存在本地xml配置文件中,于是就去查了下别人的资料,自己加以整理学习。
WPF应用程序中有一个App.config文件,编译时会在Debug文件夹下生成一个“程序集名称+.exe.config”的xml文件,记录一些配置项。废话不多说,下面开始来完成记住账号密码这个需求:
1.首先在App.config中的
2.前台放上账号,密码和是否记住这几个控件,后台需要引用System.Configuration.dll这个类库,这个类库提供了对客户端应用程序配置文件的访问方法。以下是对配置文件中键值对读写操作的方法:
1)读的方法根据传入键名去找对应的值返回。
2)写的方法传入键值,不为NULL则跟新配置文件。
///
/// 读取客户设置
///
///
///
public static string GetSettingString(string settingName)
{
try
{
string settingString = ConfigurationManager.AppSettings[settingName].ToString();
return settingString;
}
catch (Exception)
{
return null;
}
}
///
/// 更新设置
///
///
///
public static void UpdateSettingString(string settingName, string valueName)
{
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
if (ConfigurationManager.AppSettings[settingName] != null)
{
config.AppSettings.Settings.Remove(settingName);
}
config.AppSettings.Settings.Add(settingName, valueName);
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");
}
初始化的时候读取配置赋值:
txtUsername.Text = GetSettingString("userName");
txtPassword.Text = GetSettingString("password");
if (GetSettingString("isRemember") == "true")
{
ckbRemember.IsChecked = true;
}
else
{
ckbRemember.IsChecked = false;
}
登陆成功,修改配置:
UpdateSettingString("userName", txtUsername.Text);
UpdateSettingString("password", txtPassword.Text);
UpdateSettingString("isRemember", "true");
下面放上所有代码(新手写的不好,仅供参考):
前台Xaml:
账号:
密码:
记住我
后台C#:
using System;
using System.Windows;
using System.Configuration;
namespace WpfApplication7
{
///
/// MainWindow.xaml 的交互逻辑
///
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
txtUsername.Text = GetSettingString("userName");
txtPassword.Text = GetSettingString("password");
if (GetSettingString("isRemember") == "true")
{
ckbRemember.IsChecked = true;
}
else
{
ckbRemember.IsChecked = false;
}
}
private void Button_Click(object sender, RoutedEventArgs e)
{
if (Convert.ToBoolean(ckbRemember.IsChecked))
{
UpdateSettingString("userName", txtUsername.Text);
UpdateSettingString("password", txtPassword.Text);
UpdateSettingString("isRemember", "true");
MessageBox.Show("登录并记住密码!");
}
else
{
UpdateSettingString("userName", "");
UpdateSettingString("password", "");
UpdateSettingString("isRemember", "");
MessageBox.Show("登录不记住密码!");
}
}
///
/// 读取客户设置
///
///
///
public static string GetSettingString(string settingName)
{
try
{
string settingString = ConfigurationManager.AppSettings[settingName].ToString();
return settingString;
}
catch (Exception)
{
return null;
}
}
///
/// 更新设置
///
///
///
public static void UpdateSettingString(string settingName, string valueName)
{
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
if (ConfigurationManager.AppSettings[settingName] != null)
{
config.AppSettings.Settings.Remove(settingName);
}
config.AppSettings.Settings.Add(settingName, valueName);
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");
}
}
}
做这个功能的时候发现一些问题,在VS里面编译运行的时候,发现App.config的键值对始终不会变,查了半天资料才知道,App.config文件编译时会在Debug文件夹下生成一个“.exe.config”的xml文件和一个“.vshost.exe.config”的xml文件,编译时修改的是“.vshost.exe.config”文件,直接运行时修改的是“.exe.config”文件,而不是App.config文件。下面是摘抄的网上的资料:
app.config, *.exe.config 和 *.vshost.exe.config区别
1.app.config
作为开发时配置参数的文件,可以在vs开发时右键属性设置是否复制到可执行程序同目录下(默认始终不复制)。在不复制的情况下,编译生成可执行程序时会copy该文件为*.exe.config文件和*.vshost.exe.config文件。这样的话,在*/bin/debug/ 或者*/bin/release/目录下就不会有app.config文件了,对应的有exe.config和vshost.exe.config。以后运行exe文件所操作的配置文件(通过System.Configuration对象,System.Configuration config = System.Configuration.ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None))直接修改的是exe.config文件。
2.*.exe.config
vs调试编译时,如果app.config文件有修改,则会重新copy覆盖到exe.config和vshost.exe.config文件中,否则exe.config不会改变。exe.config文件为程序实际运行时(直接运行.exe程序)直接操作的配置文件。
3.*.vshost.exe.config
该文件主要是在vs调试运行时起作用,在调试运行程序时(*vshost.exe -> *.exe)先copy *.exe.config覆盖*.vshost.exe.config,然后运行程序时操作的配置文件为*.vshost.exe.config.在调试程序结束时(*.exe -> *.vshost.exe)再次copy *.exe.config覆盖*.vshost.exe.config。 所有调试情况下无论怎么修改配置文件,程序退出后都不会修改配置文件(还原了)。所以在vs调试运行程序时通过配置文件来记录之前的操作无法生效。
实际release版本的exe程序时,*.vshost.exe.config 和app.config(如果copy了的话)可以不要的,但是*.exe.config文件必须有。
每次做新功能都能学习到一些新东西,当然也会碰到新问题而耽误时间,不管咋样,问题解决就好,快乐工作,快乐学习,一起努力进步吧。o(^▽^)o