WPF状态保存

由于WPF做客户端的时候,它不像BS那样有Session,Cookie给你使用,所以保存状态你首先想到的就是数据库了。
但是你不可能什么都放在数据库,为此还专门为它建立一张表。
而WPF中能用到的除了数字存储仓,Redis,MemoryCache之外,最简单最直接的办法就是保存到本地。

image
像这种,记得qq登录界面也是差不多类似情况。
如果像qq那样。只有一个记住密码,我们完全可以使用静态来做,简单高效,而项目如果大了,就需要我们面向接口编程。
这里我顺便教大家,怎么创建接口,并实现功能。
1、我们上一次关闭程序的时候打勾还是没有打勾,我们要让程序记住,并且让他们读取出来。

 protected override void OnStartup(StartupEventArgs e)
 {
     base.OnStartup(e);
     //程序启动加载上一次关闭时SetData的数据状态
     StateHelper.ApplySavedState();
     
 }
 
  public static void ApplySavedState()
 {
     if (File.Exists("settings.json"))
     {
         string serializedSettings = File.ReadAllText("settings.json");
         var settingsList = JsonConvert.DeserializeObject<List<MusicSettings>>(serializedSettings);

         foreach (var settings in settingsList)
         {
             if (settings.Type == SettingType.StartupInfo)
             {
                 var startupInfo = SetDetailData.Instance.CommonSetInfos.FirstOrDefault(s => s.Id == settings.Id);
                 if (startupInfo != null)
                 {
                     startupInfo.IsSelected = settings.IsSelected;
                 }
             }
             else if (settings.Type == SettingType.DownLoadInfo)
             {
                 var downLoadInfo = SetDetailData.Instance.DownLoadInfos.FirstOrDefault(d => d.Id == settings.Id);
                 if (downLoadInfo != null)
                 {
                     downLoadInfo.IsSelected = settings.IsSelected;
                 }
             }
             else if (settings.Type == SettingType.LyricsSetInfo)
             {
                 var lyricsSetInfo = SetDetailData.Instance.LyricsSetRowInfos.FirstOrDefault(d => d.Id == settings.Id);
                 if (lyricsSetInfo != null)
                 {
                     lyricsSetInfo.IsSelected = settings.IsSelected;
                 }
             }
         }
     }
 }

2、程序关闭的时候,要保存我们的状态,然后关闭,
在这张图片中,我们可以直接在点击的同时进行保存操作。
把这个点击当作命令来写就行

 private DelegateCommand _saveState;
 public DelegateCommand SaveState =>
     _saveState ?? (_saveState = new DelegateCommand(ExecuteSave));

 private void ExecuteSave()
 {
      _settingsService.SaveDataStateInfos(SetDetailData.Instance.CommonSetInfos);
     //StateHelper.SaveState(SetDetailData.Instance.StartupInfos);
     
 }

现在,建立接口。
我们首先要明白,这个接口是做什么的,能做什么?
我们实现的功能时WPF的状态保存,我们一定要有保存功能,

/// <summary>
/// 保存加载用户保存CheckBox和RadioButton的信息
/// </summary>
public interface ISettingsService
{
    /// <summary>
    /// 保存页面的数据
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="stateInfos"></param>
    void SaveDataStateInfos<T>(ObservableCollection<T> stateInfos);
}

然后就是实现这个接口并完善功能

 public class SettingsService : ISettingsService
 {
	  public void SaveDataStateInfos<T>(ObservableCollection<T> stateInfos)
	 {
		 foreach (var stateInfo in stateInfos)
		 {
			 if (_typeMap.TryGetValue(stateInfo.GetType(), out SettingType settingType))
			 {
				 var settings = _settingsList.FirstOrDefault(s => s.Id == GetId(stateInfo) && s.Type == settingType);
				 if (settings != null)
				 {
					 settings.IsSelected = GetIsSelected(stateInfo);
				 }
				 else
				 {
					 settings = new MusicSettings() { Id = GetId(stateInfo), IsSelected = GetIsSelected(stateInfo), Type = settingType };
					 _settingsList.Add(settings);
				 }
			 }
		 }

		 string serializedSettings = JsonConvert.SerializeObject(_settingsList);
		 File.WriteAllText(StateFileName, serializedSettings);
	 }
 
 }
posted @ 2023-08-15 15:36  孤沉  阅读(268)  评论(0编辑  收藏  举报