由于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. 《ASP.NET Core 微服务实战》-- 读书笔记(第1章 、第2章)

    译者序 微服务设计方法清晰定义了各个开发团队的业务边界,微服务框架以不同方式实现了服务之间的协作与集成. .NET Core 作为全新的 .NET 技术,它不仅完全开源.跨平台,更面向云原生开发进行了 ...

  2. 【幻兽帕鲁】专用服务器攻略来啦!一键部署,5s开服

    本文分享自华为云社区<全网最易用.最实用.最好用的[幻兽帕鲁]专用服务器攻略来啦!一键部署,5s开服!>,作者: 云容器大未来. 华为云隆重推出"帕鲁服务器-云耀云容器版&quo ...

  3. SP277 CTGAME - City Game 题解

    题目传送门 前置知识 单调栈 解法 令 \(f_{i,j}(1 \le i \le n,1 \le j \le m)\) 表示从 \((1,j)\) 到 \((i,j)\) 中以 \((i,j)\) ...

  4. MOS 管工作原理

    浅谈MOS管的工作原理_数字IC修行者的博客-CSDN博客_mos管工作原理 一文讲明白MOS管工作原理 - 知乎 (zhihu.com) 闪存基本原理 (sohu.com)

  5. 如何基于three.js(webgl)引擎架构,实现3D密集架库房,3D档案室(3d机器人取档、机器人盘点、人工查档、设备巡检)

     前言: 这是最好的时代,也是最坏的时代:是充满挑战的时代,也是充满机遇的时代.是科技飞速的时代,也是无限可能的时代. 近年来,人工智能(AI)技术的飞速发展已经席卷了全球,不断突破着技术边界,为各行 ...

  6. 分享一个Github相关彩蛋

    楼上很多回答 都是基于手把手实操Github.Git源代码管理相关, 这些操作"无他,唯手熟尔". 今天提供一个github上阅读源码的小技巧,逆天级别的彩蛋. 要想成为大神,Gi ...

  7. Flutter学习(一)——创建一个项目

    本文基于 flutter 2.5.1,开发工具 Visual Studio Code. 一.创建 打开 VS Code 点击 View > Command Palette-(快捷键command ...

  8. 【Azure Developer】使用 Azure PowerShell 执行 Azure 表存储操作时遇见的4个问题

    要使用PowerShell操作Azure的表存储,需要经过以下步骤: 1:必须安装 Az 和 AzTable 模块.安装命令为: #安装 Az 模块 Install-Module -Name Az - ...

  9. 关于 LLM 和知识图谱、图数据库,大家都关注哪些问题呢?

    自 LLM 系列文章<知识图谱驱动的大语言模型 Llama Index>.<Text2Cypher:大语言模型驱动的图查询生成>.<Graph RAG: 知识图谱结合 L ...

  10. STL-RBT_map,set模拟实现

    set #include"26RBT_container.h" namespace test { //set通过普通迭代器使用const迭代器实现限制key不能被修改 templa ...