首页 > 其他分享 >WPF状态保存

WPF状态保存

时间:2023-08-15 15:45:26浏览次数:35  
标签:状态 settings 保存 stateInfo IsSelected var WPF Id

由于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);
	 }
 
 }

标签:状态,settings,保存,stateInfo,IsSelected,var,WPF,Id
From: https://www.cnblogs.com/guchen33/p/17631384.html

相关文章

  • 使用 OpenSSL 解密 DBeaver 保存的数据库连接信息获取数据库连接密码
    你是不是使用任何软件时都喜欢记住密码?是的,我也喜欢。但如果有一天你想把密码分享给其他人,而你又不记得密码是什么了,没错你可以去查看已保存的密码,但是当你使用的是DBeaver时,不好意思,没有查看已保存的密码功能,这个时候不就尴尬了嘛。那么现在你也许不再需要因此而烦恼了,因为......
  • WPF如何构建MVVM+模块化的桌面应用
    为何模块化模块化是一种分治思想,不仅可以分离复杂的业务逻辑,还可以进行不同任务的分工。模块与模块之间相互独立,从而构建一种松耦合的应用程序,便于开发和维护。开发技术.Net6+WPF+Prism(v8.0.0.1909)+HandyControl(v3.4.0)知识准备什么是MVVMModel-View-ViewModel......
  • 有个pil_img数据,目前我使用pil_img.save('img.jpg')保存图片,然后在使用img =open('img
    fromPILimportImageimportio#假设pillow_img是Pillow图像对象#这里使用一个示例对象,实际应根据你的数据进行替换pillow_img=Image.open('input_image.jpg')#将Pillow图像数据保存到内存中image_stream=io.BytesIO()pillow_img.save(image_stream,format='JP......
  • Oracle启动监听报错:The listener supports no services或出现 unknown状态解决
    1、查看$ORACLE_HOME/network/admin/listener.ora文件中的host是否正确,能不能ping通2、查看$ORACLE_HOME/network/admin/tnsnames.ora文件中的host是否与listener.ora中的一致3、查看/etc/hosts文件中的127.0.0.1是不是localhost,listener.ora中host跟这里的是否一样4、登录数......
  • 【愚公系列】2023年08月 WPF控件专题 XAML介绍
    (文章目录)<hrstyle="border:solid;width:100px;height:1px;"color=#000000size=1">前言WPF(WindowsPresentationFoundation)是微软推出的一种基于.net框架的图形用户界面技术,它使用XAML(eXtensibleApplicationMarkupLanguage)作为UI的描述语言。XAML是一种基于XML的标记......
  • session 中对象实例在不同事务中的状态
    不同事务中执行hibernatequery,则查询出来的对象会在不同session中,或一个在托管态,一个在session中管理,所以是不同实例。  如果在同一事务中的话,则多次query出来的对象实际上是同一个实例,当你改变第一次query出来的对象时,之后你再query出来的实例就会反映第一次的变化。同一事务......
  • LE Link Layer层状态
    standby(就绪状态)不能发送和接受数据,能够从其他状态跳转到当前状态advertising(广播状态)发广播包并监听和响应由该广播包触发的响应,可从standby->advertisingscanning(扫描状态)监听广播包,可从standby->scanninginitiating(发起状态)监听指定设备广播包并响应这些广播包来启动与......
  • 怎么解释web api 是无状态
    WebAPI被称为无状态,这主要是指它不会保存客户端的任何数据。每一个请求需要携带所有必要的信息,因为WebAPI不会记住前一次请求的信息。它的设计是完全无状态的,每一次请求都是一个全新的交互,不依赖于任何历史上的信息或状态。对应的,这种无状态的规范让WebAPI更易扩展和管理,同时也......
  • VsCode中ctrl+s保存后会在当前目录下自动生成dist目录
    在VsCode中ctrl+s后会在当前目录下自动生成dist目录解决办法:关闭compile-hero插件在设置中搜索compile-hero插件网址:yii666.com<关闭所有自动生成dist目录的选项(如下图所示)   ......
  • WPF 由TreeView想到的 DataTemplate,HierarchicalDataTemplate
    DataTemplate简而言之,解决的就是后台代码中的类以怎么样的形式展现在xaml前台代码中的问题。所以DataTemplate一般都要指定DataType,一般放在resource中,而HierarchicalDataTemplate是一种特殊的DataTemplate,它指定一个ItemsSource,当自身属性是列表时,有次序的在前台展示下去。以......