另辟新径实现 Blazor/MAUI 本机交互(二)
1.bh002- Blazor hybrid / Maui 保存设置快速教程2.bh002- Blazor hybrid / Maui 使用ORM和数据库快速教程3.bh001- Blazor hybrid / Maui 使用摄像头和扫码快速教程4.bh003- Blazor hybrid / Maui 使用蓝牙BLE快速教程5.bh004- Blazor hybrid / Maui 使用 BootstrapBlazor UI 库快速教程6.bh006- Blazor hybrid / Maui 使用NFC快速教程7.如何在 Maui Blazor 使用 BlazorWebView 像本机浏览器一样下载文件?8.【多图】发布用于App Store分发的 iOS 应用9..NET Core 跨平台 GUI 开发 与 Blazor / MAUI 10.如何为面向 Windows 的 MAUI Blazor 应用程序设置窗口标题?11.如何在 .NET MAUI 中加载 json 文件?12.发布 .NET 7 MAUI / MAUI Blazor 应用到 Windows 应用商店13.谷歌地图之类的api要在 maui 里面使用, 需要授权0.0.0.0的IP14.发布 .NET MAUI / MAUI Blazor 应用 (1) - Windows15.MAUI Blazor 权限经验分享 (定位,使用相机)16.Blazor Hybrid / MAUI 简介和实战17.在 Mac 上开发 .NET MAUI18.在 M1 Mac 上开发 .NET MAUI (iOS)19.树莓派4b装系统到运行 Blazor Linux 本地程序全记录20.在 Blazor WASM 中手撸一个.NET MD5类21.Maui blazor ios 按设备类型设置是否启用safeArea22.BootstrapBlazor 模板适配移动设备使用笔记23.ZXing Blazor 扫码组件 , ssr/wasm通用24.mac arm 调试 maui 提示 iOS 构建没有“net8.0-ios/iossimulator-x64”的目标25.Blazor OIDC 单点登录授权实例7 - Blazor hybird app 端授权26.Blazor/Hybird 触屏下单程序调优笔记27..Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 发布到 Win7+28.BlazorHybrid 通过Blazor简单调用本机功能29.让maui的mac app里的webview组件支持调试30.转发wsa和安卓模拟器网络31.解决某些安卓系统webview版本低于92无crypto .randomUUID方法32.Blazor 渲染当前语言区小数点格式对应编辑组件33.另辟新径实现 Blazor/MAUI 本机交互(一)
34.另辟新径实现 Blazor/MAUI 本机交互(二)
35.Maui 基础 - Preferences 存储和检索应用程序的首选项36.另辟新径实现 Blazor/MAUI 本机交互(三)37.另辟新径实现 Blazor/MAUI 本机交互(四)NativeApi.cs
内部部分类,该类提供了几个与文件操作相关的方法。
set_config(), get_config() 方法:
private string PrinterNameKey = "PrinterName";
private string printerName = "Unknown";
public Task<string> set_config(string printerName)
{
Preferences.Set(PrinterNameKey, printerName);
return Task.FromResult("ok");
}
public Task<string> get_config()
{
printerName = Preferences.Default.Get(PrinterNameKey, printerName);
return Task.FromResult(printerName);
}
- 该方法从应用程序的首选项中设置或获取打印机名称 (printerName)。Maui 基础 - Preferences 存储和检索应用程序的首选项
- 使用 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 中存储自定义对象?
Maui 基础 - Preferences 存储和检索应用程序的首选项
完整代码
using System.Text;
using System.Text.Json;
namespace MauiBridge;
internal partial class NativeApi : object
{
private string PrinterNameKey = "PrinterName";
private string printerName = "Unknown";
/// <summary>
/// 从应用程序的首选项中获取打印机名称 (printerName)
/// </summary>
/// <returns></returns>
public Task<string> get_config()
{
printerName = Preferences.Default.Get(PrinterNameKey, printerName);
return Task.FromResult(printerName);
}
/// <summary>
/// 打开文件选择对话框,读取文件内容并将其转换为 Base64 编码的字符串返回
/// </summary>
/// <returns>文件内容 Base64 编码的字符串</returns>
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;
}
/// <summary>
/// 将给定的数据保存到指定文件名的文件,返回文件路径
/// </summary>
/// <param name="data"></param>
/// <param name="fileName"></param>
/// <returns>文件路径</returns>
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;
}
}
/// <summary>
/// 存储自定义对象 User, 将自定义对象序列化为 string 类型,然后再存储
/// </summary>
/// <param name="user"></param>
public void SaveUser(User user)
{
string jsonString = JsonSerializer.Serialize(user);
Preferences.Set("user", jsonString);
}
/// <summary>
/// 检索自定义对象 User, 从 Preferences 中检索字符串,然后将其反序列化为自定义对象
/// </summary>
/// <returns></returns>
public User? GetUser()
{
string jsonString = Preferences.Get("user", string.Empty);
if (string.IsNullOrEmpty(jsonString))
{
return null;
}
return JsonSerializer.Deserialize<User>(jsonString);
}
}
/// <summary>
/// 在 Preferences 中存储自定义对象, https://www.cnblogs.com/densen2014/p/18710319
/// </summary>
public class User
{
public string? Name { get; set; }
public int Age { get; set; }
}
关联项目
FreeSql QQ群:4336577
BA & Blazor QQ群:795206915
Maui Blazor 中文社区 QQ群:645660665
知识共享许可协议
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名AlexChow(包含链接: https://github.com/densen2014 ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系 。
转载声明
本文来自博客园,作者:周创琳 AlexChow,转载请注明原文链接:https://www.cnblogs.com/densen2014/p/18710286
AlexChow
今日头条 | 博客园 | 知乎 | Gitee | GitHub
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 拒绝繁忙!免费使用 deepseek-r1:671B 参数满血模型
· 本地搭建DeepSeek和知识库 Dify做智能体Agent(推荐)
· DeepSeek-R1本地部署如何选择适合你的版本?看这里
· DeepSeek本地化部署超简单,比装个office还简单
· 基于deepseek模型知识库,Cherry Studio和AnythingLLM使用效果对比