Windows8 Metro开发 (04) : 保存/读取本地应用程序设置
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using Windows.Storage;
- namespace Win8_Study.Pages
- {
- class LocalDataUtil
- {
- #region 保存/读取基本类型数据
- public static void SaveData(string key, object value)
- {
- ApplicationData.Current.LocalSettings.Values[key] = value;
- }
- public static object GetData(string key)
- {
- return ApplicationData.Current.LocalSettings.Values[key];
- }
- public static void RemoveData(string key)
- {
- ApplicationData.Current.LocalSettings.Values.Remove(key);
- }
- #endregion
- }
- }
- public sealed partial class LocalDataPage : Win8_Study.Common.LayoutAwarePage
- {
- private readonly string TEXT_VALUE = "国米_百度百科\n" +
- "国际米兰足球俱乐部(Football Club Internazionale Milano,简称 Inter 或 Internazionale)" +
- "是一家位于意大利北部伦巴第区米兰市的足球俱乐部。";
- private readonly double TEXT_FONT_SIZE = 24;
- private readonly string TEXT_FONT_SIZE_KEY = "LocalDataPage-TEXT_FONT_SIZE_KEY";
- public LocalDataPage()
- {
- this.InitializeComponent();
- }
- protected override void LoadState(Object navigationParameter, Dictionary<String, Object> pageState)
- {
- Init();
- }
- private void Init()
- {
- //首先读取之前保存的设置,如果为空设置成默认状态
- InitFontSize();
- leftTextBlock.Text = TEXT_VALUE;
- }
- protected override void SaveState(Dictionary<String, Object> pageState)
- {
- }
- #region 保存程序设置
- private void OnLeftComboBoxSelectionChanged(object sender, SelectionChangedEventArgs e)
- {
- var comboBox = sender as ComboBox;
- var item = comboBox.SelectedItem as ComboBoxItem;
- SetTextFontSize(Convert.ToDouble(item.Content));
- }
- private void SetTextFontSize(double size)
- {
- leftTextBlock.FontSize = size;
- LocalDataUtil.SaveData(TEXT_FONT_SIZE_KEY, size);
- }
- private void InitFontSize()
- {
- var obj = LocalDataUtil.GetData(TEXT_FONT_SIZE_KEY);
- double size = TEXT_FONT_SIZE;
- if (obj != null)
- {
- size = Convert.ToDouble(obj);
- }
- foreach (var element in leftFontSizeComboBox.Items)
- {
- var item = element as ComboBoxItem;
- if (item.Content.ToString().Equals(size.ToString()))
- {
- leftFontSizeComboBox.SelectedItem = item;
- break;
- }
- }
- }
- #endregion
- ...
- }
或许你会尝试着用这种方法去非基本类型的数据(比如Page,Color什么的)。嘿嘿,挂了吧。
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Runtime.Serialization;
- using System.Text;
- using System.Threading.Tasks;
- namespace Win8_Study.Pages
- {
- [DataContract]
- public abstract class People
- {
- [DataMember]
- public string Name { get; set; }
- [DataMember]
- public int Age { get; set; }
- public People(string name,int age)
- {
- this.Name = name;
- this.Age = age;
- }
- }
- [DataContract]
- public class Student : People
- {
- [DataMember]
- public int Score { get; set; }
- public Student(string name, int age, int score)
- : base(name, age)
- {
- this.Score = score;
- }
- }
- [DataContract]
- public class Coder : People
- {
- [DataMember]
- public int WorkYears { get; set; }
- public Coder(string name, int age, int workYears)
- : base(name, age)
- {
- this.WorkYears = workYears;
- }
- }
- }
我们需要在ListView上随机显示一些学生和程序员的信息,并保存下来。然后清空ListView,读取保存的数据,看结果与之前的是否相同。
- private List<People> GetPeopleDatas()
- {
- List<People> peoples = new List<People>();
- Random ran = new Random(DateTime.Now.Millisecond);
- int count = ran.Next(5) + 5;//5 - 10
- for (int i = 0; i < count; ++i)
- {
- int type = ran.Next(2);
- if (type == 0)
- {
- peoples.Add(new Student("学生" + (i + 1), ran.Next(12) + 6, 60 + ran.Next(41)));
- }
- else
- {
- peoples.Add(new Coder("程序员" + (i + 1), ran.Next(10) + 22, ran.Next(5)));
- }
- }
- return peoples;
- }
根据类别创建不同ListView项
- private void OnRightRandomAddDataButtonClicked(object sender, RoutedEventArgs e)
- {
- _peoples = GetPeopleDatas();
- SetListViewData(_peoples);
- }
- private void SetListViewData(List<People> peoples)
- {
- itemListView.Items.Clear();
- foreach (People p in peoples)
- {
- ListViewItem item = new ListViewItem();
- item.FontSize = 20;
- if (p is Student)
- {
- Student s = p as Student;
- item.Content = string.Format("{0} 年龄:{1} 成绩: {2}", s.Name, s.Age, s.Score);
- }
- else
- {
- Coder c = p as Coder;
- item.Content = string.Format("{0} 年龄:{1} 工作时间: {2}年", c.Name, c.Age, c.WorkYears);
- }
- itemListView.Items.Add(item);
- }
- }
保存数据
- private async void OnRightSaveDataButtonClicked(object sender, RoutedEventArgs e)
- {
- await SerializerUtil.XMLSerialize(_peoples,typeof(List<People>));
- await PopupUtil.ShowMessageDialog(string.Format("保存数据成功! item数量{0}",_peoples.Count), "提示");
- }
注意到People,Student,Coder中的序列化标志的吗?不添加的话是无法序列化的。
- public static async Task XMLSerialize(object instance, Type type)
- {
- //取得当前程序存放数据的目录
- StorageFolder folder = Windows.Storage.ApplicationData.Current.LocalFolder;
- //定义文件名
- string fileName = "LocalDataPage-list_data.xml";
- //创建文件,如果文件存在就覆盖
- StorageFile newFile = await folder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting)
- //将内容序列化至文件
- Stream newFileStream = await newFile.OpenStreamForWriteAsync();
- DataContractSerializer ser = new DataContractSerializer(type, GetTypes());
- ser.WriteObject(newFileStream, instance);
- newFileStream.Dispose();
- }
注意GetTypes()方法,在序列化的时候需要指定序列化对象的类型集合。在这里需要序列化的数据类型有3个:People,Student,Coder。所以我们应该这样设定:
- private static ObservableCollection<Type> GetTypes()
- {
- //添加要序列化的类型
- if (_Types == null)
- {
- _Types = new ObservableCollection<Type>();
- _Types.Add(typeof(People));
- _Types.Add(typeof(Student));
- _Types.Add(typeof(Coder));
- }
- return _Types;
- }
其中_Types是全局对象ObservableCollection<Type>。
- private async void OnRightLoadDataButtonClicked(object sender, RoutedEventArgs e)
- {
- try
- {
- var obj = await SerializerUtil.XMLDeserialize(typeof(List<People>));
- _peoples = obj as List<People>;
- SetListViewData(_peoples);
- await PopupUtil.ShowMessageDialog(string.Format("读取数据成功! item数量{0}", _peoples.Count),
- "提示");
- return;
- }
- catch (FileNotFoundException)
- {
- }
- await PopupUtil.ShowMessageDialog("你还没有保存数据。", "提示");
- }
反序列化
- public static async Task<object> XMLDeserialize(Type type)
- {
- StorageFolder folder = Windows.Storage.ApplicationData.Current.LocalFolder;
- string fileName = "LocalDataPage-list_data.xml";
- StorageFile newFile = await folder.GetFileAsync(fileName);
- Stream newFileStream = await newFile.OpenStreamForReadAsync();
- //进行反序列化
- DataContractSerializer ser = new DataContractSerializer(type, GetTypes());
- object instance = ser.ReadObject(newFileStream);
- newFileStream.Dispose();
- return instance;
- }
可以看到读取的数据与之前保存的相同.我们的目的达到了。
- <ArrayOfPeople xmlns="http://schemas.datacontract.org/2004/07/Win8_Study.Pages" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><People i:type="Student"><Age>14</Age><Name>学生1</Name><Score>66</Score></People><People i:type="Coder"><Age>24</Age><Name>程序员2</Name><WorkYears>4</WorkYears></People><People i:type="Student"><Age>7</Age><Name>学生3</Name><Score>86</Score></People><People i:type="Coder"><Age>23</Age><Name>程序员4</Name><WorkYears>1</WorkYears></People><People i:type="Coder"><Age>25</Age><Name>程序员5</Name><WorkYears>2</WorkYears></People></ArrayOfPeople>
Windows8 Metro开发 (04) : 保存/读取本地应用程序设置相关推荐
- android怎么写本地图片,Android 开发图片保存在本地
/** * 图片存储到本地 方法2 * * @param bitmap */ public static void compressImagetwo(Bitmap bitmap) { try { St ...
- Windows8 Metro开发 (02) : AppBar控件之TopAppBar
Appbar分为2种: 显示在页面顶部的TopAppBar 显示在页面底部的BottomAppBar TopAppBar一般用于页面导航,BottomAppBar则用来处理一些用户事件. 本文仅介绍T ...
- Windows8 Metro开发 (03) : AppBar控件之BottomAppBar
BottomAppBar 在介绍BottomAppBar之前还是先上张图. 这次我们关注底部的AppBar. 上图的AppBar分为左右2个部分. 左侧是引用系统自带的AppBar按钮,右侧是自定义的 ...
- Android开发 拍照+读取相册+保存到本地
Android Studio 新建项目,Minimum SDK选择API 28: android 9.0(Pie),在华为Mate20 Pro 测试通过. AndroidManifest.xml中添加 ...
- qss qmenu 设置icon位置大小_实战PyQt5: 125-使用配置文件来保存和恢复应用的设置...
在通常情况下,用户使用一个软件的时候,期望保存一些数据状态,比如窗口的大小和位置,主题,选项,最近操作过的文件等等信息,在下一次启动软件的时候就自动加载这些信息,让软件恢复到上一次退出时的状态.在Wi ...
- 使用Jlink读取单片机内部程序
Jlink工具作为常用的调试工具,其亦可以单独下载文件到MCU,需要借助JFLASH工具,下载地址如下 https://www.segger.com/downloads/jlink/ 直接下载jlin ...
- (Metro学习三)图片uri保存到本地图片库
已知网络上图片的uri地址,如何将网络图片保存到本地呢?代码如下: 保存图片到本地 private async Task SaveImageFromUrl(string uri, string fil ...
- Java开发Twitter爬虫抓取图片和视频并保存到本地
零.目标 使用Java开发爬虫,爬取Twitter状态下评论中的图片和视频,并将其保存到本地. 一.调研爬虫框架 Twitter4J: https://github.com/Twitter4J/Twi ...
- 【UWP通用应用开发】文件选取器、获取文件属性、写入和读取、保存读取和删除应用数据
读取文件和文件夹名 这一节开始我们将陆续看到UWP通用应用是如何获取到文件及文件夹的属性等信息,以及如何写入和读取数据等,当然了最重要的还是如何保存读取和删除应用的数据. 在Windows上读取文件名 ...
最新文章
- 广发银行运维实践分享:Docker适配传统运维那些事
- python权限管理系统_PMS:支持多应用的统一权限管理系统,用flask+vue实现
- 技术解读|云上企业级存储——打开存储新维度,促进用户核心业务创新
- windows分辨率修改工具_Windows 字体优化,这几个办法能帮你解决
- C# 数值和字符串之间的相互转换
- rs232串口驱动_RS232与RS485在性能上有啥区别和联系?老电工总结分析,一目了然...
- redis.conf配置文件详解
- 【java】dubbo基础学习
- Python中fastapi构建的web项目配置环境变量
- C++《STL全集》
- FreeSWITCH 初步
- 划分数算法概述及习题
- 常用名词理解(APK,SDK,JDK,API,DLL)
- 设置自定义电脑屏幕分辨率
- 有谁知道win10appdata文件夹可以删除吗,删除的方法是什么
- 纯字母域名批量注册的详细步骤
- 增强现实(AR)、虚拟现实(VR)、混合现实(MR)之间有什么区别?
- qq邮箱邮件被拦截如何找回的方法
- 2014522420145238《信息安全系统设计基础》实验五
- docker项目切换(nginx)、重启shell 脚本
热门文章
- 【Groovy】Groovy 脚本调用 ( Groovy 类中调用 Groovy 脚本 | 参考 Script#evaluate 方法 | 创建 Binding 对象并设置 args 参数 )
- 【每日随笔】使用 you-get 获取网页中的视频资源 ( Python 环境安装 | you-get 工具使用 )
- 【Android FFMPEG 开发】Android 中使用 FFMPEG 对 MP3 文件进行混音操作
- 【Android 组件化】使用 Gradle 实现组件化 ( 组件模式与集成模式切换 )
- 【数据挖掘】决策树 分类 ( 抽取分类规则 | 过拟合 | 剪枝 | 先剪 | 后剪 | 连续数值离散化 | 最优化分点 | 增益率选择划分属性 )
- 【C 语言】C 语言 函数 详解 ( 函数本质 | 顺序点 | 可变参数 | 函数调用 | 函数活动记录 | 函数设计 ) [ C语言核心概念 ]
- 4.15第8周 第一节
- 自定义 checkbox 新玩法 ?
- 多列布局——column-width
- 转:C#使用Log4Net记录日志