由于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. 计网学习笔记十 Internet Routing Protocols

    上一讲简单介绍了routing和两种最小路径算法的使用,这节课讲了两种算法是如何糅合进协议中来实现具体使用的. 这一讲内容有AS的介绍,以及IGP和BGP协议. Autonomous Systems ...

  2. Python OS.mkdirs与OS.makedirs的区别

    os.mkdir只创建最外层目录,如果创建多级目录,报错"FileNotFoundError: [WinError 3] 系统找不到指定的路径".目录存在报错. os.makedi ...

  3. es6 快速入门 系列 —— 解构

    其他章节请看: es6 快速入门 系列 解构 我们经常使用数组或对象存储数据,然后从中提取出相关数据信息 试图解决的问题 以前开发者为了从对象或数组中提取出特定数据并赋值给变量,编写了很多重复的代码, ...

  4. OGP协议的使用

    OGP协议是一套Metatags的规格,用来标注页面,告诉我们你的网页快照.帮助社交app高效并准确的获取网页中的核心链接.标题.主图.正文摘要等信息,使得该网页在社交分享中有更好的展现体验. 如果网 ...

  5. 【framework】RootWindowContainer简介

    1 前言 ​ RootWindowContainer 是窗口容器的根容器,子容器是 DisplayContent.关于其父类及祖父类的介绍,见→WindowContainer简介.Configurat ...

  6. spring boot+layui分页实战

    项目用了layui,做了个简单的图书搜索页,分享出来. 喜欢的朋友给点个赞!!! 实现效果 开发步骤 1.前端页面和JS <!DOCTYPE html> <html xmlns=&q ...

  7. WinRT: 可能是 Windows 上最好用的 Native ABI 和远程调用方案

    前言 Windows 自从很久以来就有一个叫做 COM 的 Native ABI.这是一套面向对象的 ABI,在此之上 Windows 基于 COM ABI 暴露了各种各样的 API,例如 Manag ...

  8. Java的SPI机制实践

    Java SPI机制概述 先给出结论:"Java的SPI是一种服务发现机制,用于约定接口和动态发现实现类,体现了分层解耦的思想". Java的SPI机制常用于框架扩展或组件替换,最 ...

  9. 异步aioredis连接时报错TypeError: duplicate base class TimeoutError问题

    版本 python3.11版本,aioredis 2.0.1版本,redis 7.x版本 redis.conf配置文件 daemonize yes bind 0.0.0.0 port 6379 pro ...

  10. 【Azure App Service for Windows】 PHP应用出现500 : The page cannot be displayed because an internal server error has occurred. 错误

    问题描述 PHP应用突然遇见了500 The page cannot be displayed because an internal server error has occurred.错误,但是如 ...