另辟新径实现 Blazor/MAUI 本机交互(二)
Maui 基础
Preferences 是 .NET MAUI 提供的一个静态类,用于存储和检索应用程序的首选项(即设置或配置)。它提供了一种简单的键值对存储机制,可以跨平台使用。每个平台使用其本地的存储机制来实现这些功能,例如:
- iOS 使用 NSUserDefaults
- Android 使用 SharedPreferences
- Windows 使用 ApplicationDataContainer
主要功能
- 存储值:
- Set 方法用于存储值。支持多种数据类型,如 string、int、bool、double、float、long 和 DateTime。
Preferences.Set("key", "value");
Preferences.Set("key", 123);
Preferences.Set("key", true);
- 检索值:
- Get 方法用于检索存储的值。如果键不存在,则返回默认值。
string value = Preferences.Get("key", "default_value");
int number = Preferences.Get("key", 0);
bool flag = Preferences.Get("key", false);
- 检查键是否存在:
- ContainsKey 方法用于检查指定的键是否存在。
bool exists = Preferences.ContainsKey("key");
- 移除键:
- Remove 方法用于移除指定的键及其关联的值。
Preferences.Remove("key");
- 清除所有键值对:
- Clear 方法用于清除所有存储的键值对。
Preferences.Clear();
示例
以下是一个简单的示例,展示了如何使用 Preferences 类来存储和检索应用程序的首选项:
// 存储值
Preferences.Set("username", "Alex");
Preferences.Set("isLoggedIn", true);
Preferences.Set("loginCount", 5);
// 检索值
string username = Preferences.Get("username", "default_user");
bool isLoggedIn = Preferences.Get("isLoggedIn", false);
int loginCount = Preferences.Get("loginCount", 0);
// 检查键是否存在
bool hasUsername = Preferences.ContainsKey("username");
// 移除键
Preferences.Remove("username");
// 清除所有键值对
Preferences.Clear();
Preferences 类提供了一种简单而有效的方式来管理应用程序的设置和配置,适用于跨平台的 .NET MAUI 应用程序
NativeApi.cs 文件包含一个名为 NativeApi 的内部部分类,该类提供了几个与文件操作相关的方法。
get_config() 方法:
public Task<string> get_config()
{
printerName = Preferences.Default.Get(PrinterNameKey, printerName);
return Task.FromResult(printerName);
}
- 该方法从应用程序的首选项中获取打印机名称 (printerName)。
- 使用 Preferences.Default.Get 方法获取存储的打印机名称,如果没有存储,则返回默认值。
- 返回一个包含打印机名称的任务。
open_file_dialog() 方法:
public async Task<string> open_file_dialog()
{
//work in ui thread
var res =
await MainThread.InvokeOnMainThreadAsync(async () =>
{
try
{
var result = await FilePicker.Default.PickAsync(new PickOptions());
if (result == null)
{
return "";
}
using var stream = await result.OpenReadAsync();
StreamReader reader = new StreamReader(stream);
return Convert.ToBase64String(Encoding.UTF8.GetBytes(reader.ReadToEnd()));
}
catch (Exception e)
{
var err = e.Message;
return err;
}
});
return res;
}
- 该方法在 UI 线程上运行,打开文件选择对话框。
- 使用 FilePicker.Default.PickAsync 方法打开文件选择器。
- 如果用户没有选择文件,返回空字符串。
- 如果选择了文件,读取文件内容并将其转换为 Base64 编码的字符串。
- 如果发生异常,返回异常消息。
save_file(string data, string fileName) 方法:
public async Task<string> save_file(string data, string fileName)
{
try
{
string targetFile = System.IO.Path.Combine(FileSystem.Current.AppDataDirectory, fileName);
using FileStream outputStream = File.OpenWrite(targetFile);
using StreamWriter streamWriter = new(outputStream);
await streamWriter.WriteAsync(data);
return $"file path:{targetFile.Replace("\\","\\\\")}";
}
catch (Exception e)
{
var err = e.Message;
return err;
}
}
- 该方法将给定的数据保存到指定文件名的文件中。
- 使用 Path.Combine 方法构建目标文件路径,该路径位于应用程序的数据目录中。
- 使用 File.OpenWrite 方法打开文件流,并使用 StreamWriter 写入数据。
- 写入完成后,返回文件路径。
- 如果发生异常,返回异常消息。
这些方法提供了基本的文件操作功能,包括获取配置、打开文件对话框和保存文件
如何在 Preferences 中存储自定义对象?
在 Preferences 中存储自定义对象时,由于 Preferences 仅支持基本数据类型(如 string、int、bool 等),你需要将自定义对象序列化为 string 类型,然后再存储。常用的序列化方法是使用 JSON。
以下是一个示例,展示了如何在 Preferences 中存储和检索自定义对象:
以下是每个方法的工作原理:
- 定义自定义对象
public class User
{
public string Name { get; set; }
public int Age { get; set; }
}
- 使用 JSON 序列化和反序列化
你可以使用 System.Text.Json 或 Newtonsoft.Json 库来进行 JSON 序列化和反序列化。以下示例使用 System.Text.Json:
using System.Text.Json;
public void SaveUser(User user)
{
string jsonString = JsonSerializer.Serialize(user);
Preferences.Set("user", jsonString);
}
- 检索自定义对象
public User? GetUser()
{
string jsonString = Preferences.Get("user", string.Empty);
if (string.IsNullOrEmpty(jsonString))
{
return null;
}
return JsonSerializer.Deserialize<User>(jsonString);
}
- 完整示例
将上述方法添加到你的类中,例如 NativeApi 类:
using System.Text.Json;
internal partial class NativeApi : object
{
// 现有方法...
public void SaveUser(User user)
{
string jsonString = JsonSerializer.Serialize(user);
Preferences.Set("user", jsonString);
}
public User? GetUser()
{
string jsonString = Preferences.Get("user", string.Empty);
if (string.IsNullOrEmpty(jsonString))
{
return null;
}
return JsonSerializer.Deserialize<User>(jsonString);
}
}
public class User
{
public string Name { get; set; }
public int Age { get; set; }
}
说明
- SaveUser 方法:将 User 对象序列化为 JSON 字符串,并使用 Preferences.Set 方法存储。
- GetUser 方法:从 Preferences 中检索 JSON 字符串,并将其反序列化为 User 对象。如果字符串为空,则返回 null。
通过这种方式,你可以在 Preferences 中存储和检索自定义对象
另辟新径实现 Blazor/MAUI 本机交互(二)的更多相关文章
- 萌新带你开车上p站(二)
本文作者:萌新 前情提要:萌新带你开车上p站(一) 0x04flag 看题目描述似乎是一个和脱壳相关的逆向题目 按照给出的地址先下载过来 file看看 是个可执行文件 执行之 emm什么都看不出来, ...
- Bootstrap Blazor 组件介绍 Table (二)自定义模板列功能介绍
Bootstrap Blazor 是一套企业级 UI 组件库,适配移动端支持各种主流浏览器,已经在多个交付项目中使用.通过本套组件可以大大缩短开发周期,节约开发成本.目前已经开发.封装了 70 多个组 ...
- Blazor组件自做十二 : Blazor Pdf Reader PDF阅读器 组件 (草稿)
原文链接 [https://www.cnblogs.com/densen2014/p/16954812.html] Blazor Pdf Reader PDF阅读器 组件 应小伙伴要求撸了一个简单的P ...
- Blazor组件自做十二 : Blazor Pdf Reader PDF阅读器 组件 (新版 7.1 移除pdfobject)
Blazor Pdf Reader PDF阅读器 组件 示例: https://www.blazor.zone/PdfReaders https://blazor.app1.es/pdfReaders ...
- 苹果新的编程语言 Swift 语言进阶(十二)--选项链
选项链是使用选项来查询和调用其属性.方法或下标的一个过程,假设选项包括一个值,则属性.方法.下标的查询和调用成功,否则,调用返回nil. 选项链能用在不论什么类型的选项来检查对其一个属性.方法.下标的 ...
- 对Java8新的日期时间类的学习(二)
示例11 在Java中如何判断某个日期是在另一个日期的前面还是后面 这也是实际项目中常见的一个任务.你怎么判断某个日期是在另一个日期的前面还是后面,或者正好相等呢?在Java 8中,LocalDate ...
- 利用爬虫、SMTP和树莓派3B发送邮件(爬取墨迹天气预报信息)
-----------------------------------------学无止境----------------------------------------- 前言:大家好,欢迎来到誉雪 ...
- Zookeeper基础教程(一):认识Zookeeper
引用百度百科的话 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服 ...
- Blazor Hybrid / MAUI 简介和实战
1. Blazor Blazor 是一个使用 .NET 生成交互式客户端 Web UI 的框架: 使用 C# 代替 JavaScript 来创建信息丰富的交互式 UI. 共享使用 .NET 编写的服务 ...
- Blazor——Asp.net core的新前端框架
原文:Blazor--Asp.net core的新前端框架 Blazor是微软在Asp.net core 3.0中推出的一个前端MVVM模型,它可以利用Razor页面引擎和C#作为脚本语言来构建WEB ...
随机推荐
- Codeforces Round 732 (Div
AquaMoon and Strange Sort 有 \(n\) 个人从左到右站成一排,从左数第 \(i\) 个人的衣服上印着 \(a_i\).每个人的朝向可以是朝左.朝右.一开始所有人的方向都是朝 ...
- [笔记]博弈论 & SG 函数
一直没学结果今天被创了. 一些定义: \(\text{mex}\{S\}\):集合 \(S\) 中最小的没有出现过的非负整数. \(\oplus\):按位异或.也叫做 \(\text{xor}\). ...
- springboot 前后端大打包成一个JAR
1.概述 现在开发使用前后端开发机制,在部署的时候,我们需要将前后端分别打包,使用nginx 进行统一部署.这样就比较复杂,我们可以使用前后端打包到一个jar中,这样我们只需要一个包就可以了. 2.实 ...
- Vue.js 组件基础
1.前言 本节讲述vue组件的基本格式以及实际开发的应用场景,本节内容兼容Vue2.x与Vue3.x 2.组件基础 组件的本质其实就是一个对象,这个对象包含多个属性,常见的属性有:template/d ...
- 强网杯2023 谍影重重2.0 wp
题目描述 小明是某间谍组织的一员,他终日监听着我国某重点军事基地的飞行动态,妄图通过分析参数找到我国飞的最快的飞机.我国费尽千辛万苦抓住了他,并在他的电脑上找到了一段他监听的信息,请分析出这段信息中飞 ...
- 零基础学习人工智能—Python—Pytorch学习(十二)
前言 本文介绍使用神经网络进行实战. 使用的代码是<零基础学习人工智能-Python-Pytorch学习(九)>里的代码. 代码实现 mudule定义 首先我们自定义一个module,创建 ...
- ChatGPT生成测试用例的最佳实践(四)
通常情况下还应该进行测试用例外部评审.将已完成的基于百度关键字搜索业务的功能和安全测试用例集的存放位置告知项目团队成员,需要预留出一定的时间,便于项目组研发.产品人员阅读,以免在项目团队测试用例评审会 ...
- metasploit扫描mysql空密码
靶机IP 192.168.255.100 攻击机IP 192.168.255.200 流程开始 查找mysql登录模块 msf5 > search mysql_login 加载这个模块 msf5 ...
- 【数据结构】【直接排序法】Java代码
public class 直接排序 { /** * 直接排序法 仅排序1轮 * @param arr 数组 * @param ji 基准索引,填写几,就以谁为基准进行一次划分 */ public st ...
- 【Vue】vue项目搭建、ES6的简单使用(大觅)
目录 项目搭建与基本配置 项目搭建 安装淘宝NPM镜像 cnpm 安装webpack 新建项目 运行项目 运行时出现的一些问题和解决方案 框架安装 安装UI框架iView 引入UI框架iView 引入 ...