点击关注不迷路,你的关注是我们最大的动力

持续讲解第十六天:2024-10-13 manyanedu 漫研教育

在wpf中怎么在应用中保存你的配置及用户信息,使用用户登录之后保存用户名的方式给大家讲解_哔哩哔哩_bilibili

为什么要讲这一节课

我们知道,系统在登录时,会拿到很多的需求全局使用的数据,如我们很多平台在右上解会显示用户名,有时也要根据用户的角色来判断用户的操作,所以我们要把用户登录之后的数据保存成全局,方便在其它的地方使用。

二、目前wpf中存储全局数据的几种常见方式

1、通过静态类或是静态属性

public static class GlobalSettings

{

public static string LoggedInUserName { get; set; }

}

我们在登录成功之后给这个静态类的字段赋值。如下

GlobalSettings.LoggedInUserName = "用户名";

在要使用的地方引用这个静态类,按如下方式引用

string userName = GlobalSettings.LoggedInUserName;

采用此种方式在项目中怎么实现?

第一步:创建一个用户服务类,后面可以把登录服务移到这个服务类里。

代码如下:

namespace MyAgvLesson.Common

{

public static class UserInfoService

{

public static string USER_NAME = "";

}

}

第二步:修改用户登录方法,代码如下:

private void LoginSave()

{

//会从数据库做判断

// MessageBox.Show($"用户名是:{_user?.UserName},密码是:{_user?.Password}");

if(_user==null||_user.UserName==null||_user.Password==null)

{

MessageBox.Show("用户名和密码不能为空");

return;

}

UserService userService = new UserService();

Tuple? res= userService.UserLogin(_user.UserName, _user.Password);

if(res!=null)

{

//把用户名保存到这个UserInfoService里

UserInfoService.USER_NAME=res.Item2 as string;

//打开主窗体

MainWindow main = new MainWindow();

main.Show();

//通过事件关闭登录窗体

this.CloseWindowCommandExecuted();

}

else

{

MessageBox.Show("用户名或是密码错误");

}

}

第三步:创建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:MyAgvLesson"

mc:Ignorable="d"

Title="MainWindow" Height="450" Width="800">

第四步:修改MainWindow的隐藏文件

namespace MyAgvLesson

{

///

/// MainWindow.xaml 的交互逻辑

///

public partial class MainWindow : Window

{

public MainWindow()

{

InitializeComponent();

//设置mainwindow的数据上下文

DataContext = new MainWindowViewModel();

}

}

}

2、使用Application类的`Properties

我们在登录成功之后

Application.Current.Properties["LoggedInUserName"] = "用户名";

在需要的地方使用

string userName = Application.Current.Properties["LoggedInUserName"] as string;

if (userName != null)

{

// 使用用户名

}

3、使用文件存储,如果我们有时要求系统重启之后还要保留数据,可以使用这种方式,此方法后面会讲到

4、使用依赖注入的方式

如果我们有依赖注入框架,我们可以使用依赖注入的方式更灵活的获取,特别在单元测试里可以很方便的使用。我们可以建一个服务管理类,如下

public interface IUserService

{

string LoggedInUserName { get; }

}

public class UserService : IUserService

{

private string _loggedInUserName;

public string LoggedInUserName

{

get { return _loggedInUserName; }

set { _loggedInUserName = value; }

}

}

然后我们把他注入容器,之后在要使用的地方通过构造函数注入的方式注入。此方法非常重要,后面引入框架之后会着重讲。

public class SomeViewModel

{

private readonly IUserService _userService;

public SomeViewModel(IUserService userService)

{

_userService = userService;

}

public void SomeMethod()

{

string userName = _userService.LoggedInUserName;

// 使用用户名

}

}

三、几种方式的不同

选择哪种方法取决于你的应用程序的架构和需求。静态类和Application.Properties方法更简单直接,但可能不适合所有情况,特别是当涉及到单元测试或依赖注入时。依赖注入提供了更高的灵活性和可测试性,但可能需要更多的设置工作。

一个小作业

[!IMPORTANT]

先自己录音讲一下你在wpf中怎么存储系统的配置与用户数据的?

点击关注不迷路,你们的关注是我们最大的动力

这是面试中必问的一个问题,大家引起重视。

下一节课:mainwindow的主页的菜单布局设置。