天天看點

Winform實作簡單的記住使用者名密碼功能

原文連結: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檔案必須有。

繼續閱讀