由于WPF做客户端的时候,它不像BS那样有Session,Cookie给你使用,所以保存状态你首先想到的就是数据库了。

但是你不可能什么都放在数据库,为此还专门为它建立一张表。

而WPF中能用到的除了数字存储仓,Redis,MemoryCache之外,最简单最直接的办法就是保存到本地。



像这种,记得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);
} }

WPF状态保存的更多相关文章

  1. Android Fragment使用(三) Activity, Fragment, WebView的状态保存和恢复

    Android中的状态保存和恢复 Android中的状态保存和恢复, 包括Activity和Fragment以及其中View的状态处理. Activity的状态除了其中的View和Fragment的状 ...

  2. Activity生命周期与状态保存

    弹出系统对话框,程序仍部分可见 onPause 对话框消失时 onResume   调用一个新的Activity,老的Activity不可见时 onPause->onStop 从新的Activi ...

  3. 【Android 应用开发】Activity 状态保存 OnSaveInstanceState參数解析

    作者 : 韩曙亮 转载请著名出处 : http://blog.csdn.net/shulianghan/article/details/38297083 一. 相关方法简单介绍 1. 状态保存方法演示 ...

  4. Activity生命周期,状态保存恢复(经典)

    一.整体框架 二.main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu ...

  5. Android菜鸟的成长笔记(14)—— Android中的状态保存探究(上)

    原文:[置顶] Android菜鸟的成长笔记(14)—— Android中的状态保存探究(上) 我们在用手机的时候可能会发现,即使应用被放到后台再返回到前台数据依然保留(比如说我们正在玩游戏,突然电话 ...

  6. Android菜鸟的成长笔记(15)—— Android中的状态保存探究(下)

    原文:Android菜鸟的成长笔记(15)-- Android中的状态保存探究(下) 在上一篇中我们简单了解关于Android中状态保存的过程和原理,这一篇中我们来看一下在系统配置改变的情况下保存数据 ...

  7. 【Android 应用开发】Activity 状态保存 OnSaveInstanceState参数解析

    作者 : 韩曙亮 转载请著名出处 : http://blog.csdn.net/shulianghan/article/details/38297083 一. 相关方法简介 1. 状态保存方法示例 p ...

  8. Android基础部分再学习---activity的状态保存

    主要是bundle   这个參数 參考地址:http://blog.csdn.net/lonelyroamer/article/details/18715975 学习Activity的生命周期,我们知 ...

  9. HTML5-Canvas 图形变换+状态保存

    1. 图形变换 canvas是基于状态绘制图形的.故此一般情况下,canvas的绘制的图形路径和状态时分离的. function drawShape(ctx){ // 绘制路径 shapePath(c ...

  10. Android view状态保存

    为什么我们需要保存View的状态? 这个问题问的好!我坚信移动应用应该帮助你解决问题,而不是制造问题. 想象一下一个非常复杂的设置页面: 这并不是从一个移动应用的截图(这不是典型的win32程序吗.. ...

随机推荐

  1. Oracle-ORA-12505, TNS:listener does not currently know of SID given in connect descriptor

    问题描述 ORA-12505, TNS:listener does not currently know of SID given in connect descriptorORA-12505: TN ...

  2. Windows更换笔记本电脑需要迁移和删除的内容清单

    一.需要迁移的内容清单 1.桌面和磁盘中重要的文件或者文件夹 2.chrome.Edge等浏览器的书签,可以导出 3.常用的软件安装包 (1).输入法(百度.或者搜狗) (2).浏览器(Chrome浏 ...

  3. python 中异常类型总结

    异常类型: 异常名称 描述BaseException             所有异常的基类SystemExit                   解释器请求退出KeyboardInterrupt  ...

  4. NVME学习笔记六—Controller Architecture

    Controller架构   NVMe over Fabrics使用与NVMe基础规格说明书中定义相同的controller架构.这包括主机和controller之间使用SQ提交队列和CQ完成队列来执 ...

  5. Ubuntu 22.04 Samba 安装和配置

    安装 安装 sudo apt install samba 检查服务状态 systemctl status smbd --no-pager -l 检查是否启用(开机自启动) systemctl is-e ...

  6. lsattr命令

    lsattr命令 lsattr命令用于显示文件的属性. 语法 lsattr [-RVadlv] [file | folder] 参数 -a: 显示所有文件和目录,包括以.为名称开头字符的额外内建,即现 ...

  7. php+bootstrap+jquery+mysql实现购物车项目案例

    获取源码 一键三连后,评论区留下邮箱安排发送:) 介绍 使用php,bootstrap,jquery,mysql实现的简易购物车案例. 通过本案例,你将学习到以下知识点: php 操作 mysql 实 ...

  8. Apipost参数描述的填写和参数描述库的使用

    请求参数的描述填写 对于header.query以及form-data和urlencode的body参数,我们在如下地方填写参数描述: 如图中所示,对于一个填写过的参数,我们可以在新建接口可以通过点击 ...

  9. windows 程序启动后挂到后台

    开发中遇到一个问题,程序启动后,并没有出现在前台,而是自动挂到后台,程序处于卡死状态,基本任何模块都没加载进来. 后面排查发现跟一个功能的第三方 dll 有关系,在那个 dll 加载时导致程序卡死,因 ...

  10. 【Android 逆向】【攻防世界】easy-dex

    这一题不easy,不知为何叫这个名字.... 1. apk 安装到手机,不知所云,各种亮瞎眼闪光 2. jadx 打开apk,一行java代码都没有,打开AndroidManifest看看 <? ...