原文連結:https://blog.csdn.net/qq_21509637/article/details/82148613
1.首先在App.config中的<configuration>中添加以下代碼,最常用的就是appSettings節點了,通過添加key和value鍵值對,進而完成參數的配置與讀寫操作,其中key是鍵,value是具體儲存的值,在這聲明了三個,分别是賬号、密碼和是否記住這三組kv鍵值對。
<appSettings>
<add key="userName" value="admin"/>
<add key="password" value="1"/>
<add key="isRemember" value="true"/>
</appSettings>
2.前台放上賬号,密碼和是否記住這幾個控件,背景需要引用System.Configuration.dll這個類庫,這個類庫提供了對用戶端應用程式配置檔案的通路方法。以下是對配置檔案中鍵值對讀寫操作的方法:
1)讀的方法根據傳入鍵名去找對應的值傳回。
2)寫的方法傳入鍵值,不為NULL則跟新配置檔案。
/// <summary>
/// 讀取客戶設定
/// </summary>
/// <param name="settingName"></param>
/// <returns></returns>
public static string GetSettingString(string settingName)
{
try
{
string settingString = ConfigurationManager.AppSettings[settingName].ToString();
return settingString;
}
catch (Exception)
{
return null;
}
}
/// <summary>
/// 更新設定
/// </summary>
/// <param name="settingName"></param>
/// <param name="valueName"></param>
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:
<Window x:Class="WpfApplication7.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApplication7"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="550">
<Grid>
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<TextBlock HorizontalAlignment="Right" VerticalAlignment="Center" FontSize="30">賬号:</TextBlock>
<TextBox Grid.Row="0" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center" Width="200" Height="40" FontSize="30" x:Name="txtUsername">
<TextBox.Resources>
<VisualBrush x:Key="HintText" TileMode="None" Opacity="0.5" Stretch="None" AlignmentX="Left">
<VisualBrush.Visual>
<TextBlock FontStyle="Italic" FontSize="30" Text="請輸入使用者名"/>
</VisualBrush.Visual>
</VisualBrush>
</TextBox.Resources>
<TextBox.Style>
<Style TargetType="TextBox">
<Style.Triggers>
<Trigger Property="Text" Value="{x:Null}">
<Setter Property="Background" Value="{StaticResource HintText}"/>
</Trigger>
<Trigger Property="Text" Value="">
<Setter Property="Background" Value="{StaticResource HintText}"/>
</Trigger>
</Style.Triggers>
</Style>
</TextBox.Style>
</TextBox>
<TextBlock Grid.Row="1" Grid.Column="0" HorizontalAlignment="Right" VerticalAlignment="Center" FontSize="30">密碼:</TextBlock>
<TextBox Grid.Row="1" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center" Width="200" Height="40" FontSize="30" x:Name="txtPassword">
<TextBox.Resources>
<VisualBrush x:Key="HintText" TileMode="None" Opacity="0.5" Stretch="None" AlignmentX="Left">
<VisualBrush.Visual>
<TextBlock FontStyle="Italic" FontSize="30" Text="請輸入密碼"/>
</VisualBrush.Visual>
</VisualBrush>
</TextBox.Resources>
<TextBox.Style>
<Style TargetType="TextBox">
<Style.Triggers>
<Trigger Property="Text" Value="{x:Null}">
<Setter Property="Background" Value="{StaticResource HintText}"/>
</Trigger>
<Trigger Property="Text" Value="">
<Setter Property="Background" Value="{StaticResource HintText}"/>
</Trigger>
</Style.Triggers>
</Style>
</TextBox.Style>
</TextBox>
<CheckBox Grid.Row="2" Grid.Column="0" HorizontalAlignment="Right" VerticalAlignment="Center" FontSize="30" x:Name="ckbRemember"></CheckBox>
<TextBlock Grid.Row="2" Grid.Column="1" HorizontalAlignment="Left" VerticalAlignment="Center" FontSize="30">記住我</TextBlock>
<Button Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="30" Click="Button_Click">登入</Button>
</Grid>
</Window>
背景C#:
using System;
using System.Windows;
using System.Configuration;
namespace WpfApplication7
{
/// <summary>
/// MainWindow.xaml 的互動邏輯
/// </summary>
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("登入不記住密碼!");
}
}
/// <summary>
/// 讀取客戶設定
/// </summary>
/// <param name="settingName"></param>
/// <returns></returns>
public static string GetSettingString(string settingName)
{
try
{
string settingString = ConfigurationManager.AppSettings[settingName].ToString();
return settingString;
}
catch (Exception)
{
return null;
}
}
/// <summary>
/// 更新設定
/// </summary>
/// <param name="settingName"></param>
/// <param name="valueName"></param>
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檔案必須有。