由于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. Linux-双网卡绑定bond详解

    1.什么是bond 网卡bond是通过多张物理网卡绑定为一个逻辑网卡,实现本地网卡的冗余,带宽扩容和负载均衡,在生产场景中是一种常用的技术.Kernels 2.4.12及以后的版本均供bonding模 ...

  2. 了解一下基本的http代理配置

    我们首先用一个简单例子了解一下基本的http代理配置 worker_processes 1; #nginx worker 数量 error_log logs/error.log; #指定错误日志文件路 ...

  3. Unicode编码的魅力:跨语言交流的桥梁

    引言: Unicode编码是一种用于表示世界上所有字符的标准编码方式.它解决了字符集兼容性和多语言文本处理的难题,成为实现全球化软件的关键技术.本文将深入探讨Unicode编码的优点与缺点,并介绍它在 ...

  4. Smartctrl 命令使用说明

    一.smartctl工具简介  Smartmontools是一种硬盘检测工具,通过控制和管理硬盘的SMART(Self Monitoring Analysis and Reporting Techno ...

  5. pip指定镜像安装

    清华大学开源软件镜像站

  6. Activiti7+SpringBoot

    1. 版本问题 1.1. Activiti版本 7.1.0-M6是最后一个支持JDK1.8的版本,此后的版本都要求JDK11以上 目前,Activiti最新版本是7.6.0,它是用JDK11编译的,因 ...

  7. Oracle设置和删除不可用列

    Oracle设置和删除不可用列 1.不可用列是什么? 就是表中的1个或多个列被ALTER TABLE-SET UNUSED 语句设置为无法再被程序利用的列. 2.使用场景? If you are co ...

  8. 使用 MSYS2 编译 exe 可执行程序

    MSYS2 是一个在 Windows上 运行的软件环境,它提供了一种在 Windows 上使用 GNU 工具链的方式,包括 GCC 编译器和 GNU Make 构建系统. 在 MSYS2 中,你可以使 ...

  9. 学习go语言编程之错误处理

    error接口 Golang中有一个关于错误处理的标准模式,即:error接口. type error interface { Error() string } 对于大多数函数,如果要返回错误,大致上 ...

  10. React实现导航栏点击高亮

    在jquery中实现导航栏的切换只需要一行代码找到同级其他元素removeClass以及添加点击元素addClass就可以实现了,但是React没法直接找到同级元素,这个时候需要一点js中的思维,根据 ...