UWP开发之Template10实践:本地文件与照相机文件操作的MVVM实例(图文付原代码)
前面【UWP开发之Mvvmlight实践五:SuspensionManager中断挂起以及复原处理】章节已经提到过Template10,为了认识MvvmLight的区别特做了此实例。
原代码地址:https://github.com/NewBLife/UWP/tree/master/MvvmDemo/FileOperationDemo
应用主要功能:
- 本地任何文件多项选择添加
- 照相机图片添加
- 显示添加文件(.jpg.png.pdf.xls等)的缩略图
- 列表文件删除
- 默认程序显示添加后的文件
应用技术点:
汉堡菜单(随窗口大小自动收缩)
系统返回按钮操作
StorageFile挂起复原
文件访问权限
应用截图如下:
====PC端====
主界面
点击【+】添加文件
点击列表任何文件(例如:0.PNG),使用默认应用打开文件
点击【头像】拍照
点击【Delete】可以删除列表文件
点击【设定】打开设定页面
====手机端====
主界面
点击【+】添加文件
选择任何文件(例如:list.pdf),使用默认应用打开文件
点击【头像】拍照
点击汉堡菜单选择【设定】
技术详解:
1.StorageFile文件的挂起复原
应用以外文件夹的文件挂起复原时如果通过路径获取StorageFile对象会出现以下异常,一般是通过令牌来做处理。
“System.UnauthorizedAccessException”类型的异常在 FileOperationDemo.exe 中发生,但未在用户代码中进行处理 其他信息: 拒绝访问。 (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
第一步:添加时从MRU中获取文件访问令牌
#region 获取 MRU 中文件的令牌
// 详细: https://msdn.microsoft.com/zh-cn/library/windows/apps/hh972603
// 应用外部文件访问时使用
_FileMruToken = StorageApplicationPermissions.FutureAccessList.Add(file);
#endregion
第二步:应用挂起时只保存令牌数据StorageFile属性JsonIgnore标记添加(StorageFile等对象无法反序列化复原)
/// <summary>
/// 文件信息
/// </summary>
[JsonIgnore]
public StorageFile File
{
get
{
return _File;
} set
{
Set(ref _File, value);
}
}
/// <summary>
/// 文件访问令牌
/// 挂起复原时使用
/// </summary>
[JsonProperty]
public string FileMruToken
{
get
{
return _FileMruToken;
} set
{
_FileMruToken = value;
}
}
第三步:复原时使用令牌获取StorageFile对象
// 应用外部文件
return await StorageApplicationPermissions.FutureAccessList.GetFileAsync(_FileMruToken);
2.默认应用打开文件时权限取得
// 默认应用打开文件
await Windows.System.Launcher.LaunchFileAsync(file);
直接赋值StorageFile对象到file时,是无法打开文件的,因为没有权限。这时也需要令牌从StorageApplicationPermissions.FutureAccessList获取StorageFile对象才能打开。
// 应用外部文件
return await StorageApplicationPermissions.FutureAccessList.GetFileAsync(_FileMruToken);
3.系统返回按钮事件注销时机
由于不想应用最后返回按下时关闭特加入此功能
/// <summary>
/// 返回按钮事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnBackRequested(object sender, BackRequestedEventArgs e)
{
e.Handled = true;
NavigationService.GoBack();
}
在OnNavigatedToAsync注册事件
public override async Task OnNavigatedToAsync(object parameter, NavigationMode mode, IDictionary<string, object> suspensionState)
{
try
{
if (suspensionState.Any())
{
FileList = SerializationService.Json.Deserialize<ObservableCollection<FileInfo>>(suspensionState[nameof(FileList)]?.ToString());
} // 注册系统返回按钮事件
SystemNavigationManager.GetForCurrentView().BackRequested += OnBackRequested;
await Task.CompletedTask;
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
Debug.WriteLine(ex.Source);
Debug.WriteLine(ex.StackTrace);
}
}
在OnNavigatingFromAsync注销事件
public override async Task OnNavigatingFromAsync(NavigatingEventArgs args)
{
args.Cancel = false;
// 注销系统返回按钮事件
SystemNavigationManager.GetForCurrentView().BackRequested -= OnBackRequested;
await Task.CompletedTask;
}
UWP开发之Template10实践:本地文件与照相机文件操作的MVVM实例(图文付原代码)的更多相关文章
- UWP开发之Template10实践二:拍照功能你合理使用了吗?(TempState临时目录问题)
最近在忙Asp.Net MVC开发一直没空更新UWP这块,不过有时间的话还是需要将自己的经验和大家分享下,以求共同进步. 在上章[UWP开发之Template10实践:本地文件与照相机文件操作的MVV ...
- UWP开发之Mvvmlight实践一:如何在项目中添加使用Mvvmlight(图文详解)
最近一直在做UWP开发,为了节省成本等等接触到MVVMlight,觉得有必要发点时间研究它的用法与实现原理才行.如果有问题的地方或者有好的建议欢迎提出来. 随着移动开发的热门,Mvvmlight在An ...
- UWP开发之Mvvmlight实践七:如何查找设备(Mobile模拟器、实体手机、PC)中应用的Log等文件
在开发中或者后期测试乃至最后交付使用的时候,如果应用出问题了我们一般的做法就是查看Log文件.上章也提到了查看Log文件,这章重点讲解下如何查看Log文件?如何找到我们需要的Packages安装包目录 ...
- UWP开发之ORM实践:如何使用Entity Framework Core做SQLite数据持久层?
选择SQLite的理由 在做UWP开发的时候我们首选的本地数据库一般都是Sqlite,我以前也不知道为啥?后来仔细研究了一下也是有原因的: 1,微软做的UWP应用大部分也是用Sqlite.或者说是微软 ...
- UWP开发之Mvvmlight实践六:MissingMetadataException解决办法(.Net Native下Default.rd.xml配置问题)
最近完成一款UWP应用,在手机端测试发布版(Release)的时候应用莫名奇妙的强行关闭,而同样的应用包在PC端一点问题都没有,而且Debug版在两个平台都没有问题,唯独手机的Release版有问题. ...
- UWP开发之Mvvmlight实践五:SuspensionManager中断挂起以及复原处理
最近比较忙有一段时间没有更新了,再接再厉继续分享. 案例下载:https://github.com/NewBLife/UWP/tree/master/SuspendSample 先我们看看App在生命 ...
- UWP开发之Mvvmlight实践九:基于MVVM的项目架构分享
在前几章介绍了不少MVVM以及Mvvmlight实例,那实际企业开发中将以那种架构开发比较好?怎样分层开发才能节省成本? 本文特别分享实际企业项目开发中使用过的项目架构,欢迎参照使用!有不好的地方欢迎 ...
- UWP开发之Mvvmlight实践四:{x:bind}和{Binding}区别详解
{x:bind}是随着UWP被推出而被添加的,可以说是Win10 UWP开发专有扩展.虽然 {x:Bind} 缺少{Binding} 中的一些功能,但它运行时所花费的时间和使用的内存量均比 {Bind ...
- UWP开发之Mvvmlight实践八:为什么事件注销处理要写在OnNavigatingFrom中
前一段开发UWP应用的时候因为系统返回按钮事件(SystemNavigationManager.GetForCurrentView().BackRequested)浪费了不少时间.现象就是在手机版的详 ...
随机推荐
- 基于SignalR实现B/S系统对windows服务运行状态的监测
通常来讲一个BS项目肯定不止单独的一个BS应用,可能涉及到很多后台服务来支持BS的运行,特别是针对耗时较长的某些任务来说,Windows服务肯定是必不可少的,我们还需要利用B/S与windows服务进 ...
- 数据图表插件Echarts(一)
一.引言 最近做一个智慧城市项目,项目中需要图表和报表进行数据分析,从网上找了很多,最后找到了百度开放的echarts,一个很强大的插件. 二.介绍 ECharts,缩写来自Enterprise Ch ...
- JQuery(2)
JQuery下拉框操作: 取值赋值操作 body代码: <select id="sel"> <option value="北京">北京& ...
- winform异步加载数据到界面
做一个学习记录. 有两个需求: 1.点击按钮,异步加载数据,不卡顿UI. 2.把获取的数据加载到gridview上面. 对于需求1,2,代码如下: public delegate void ShowD ...
- 调用微信退款接口或发红包接口时出现System.Security.Cryptography.CryptographicException: 出现了内部错误 解决办法
我总结了一下出现证书无法加载的原因有以下三个 1.证书密码不正确,微信证书密码就是商户号 解决办法:请检查证书密码是不是和商户号一致 2.IIS设置错误,未加载用户配置文件 解决办法:找到网站使用的应 ...
- [WPF] Wait for a moment.
一.控件介绍 在 WPF 中使用的等待控件,控件包括三种,普通的等待信息提示(WaitTip),进度条提示(WaitProgress),以及主程序覆盖的模拟时钟等待窗口(WaitClock),具体效果 ...
- iOS之开发中常用的颜色及其对应的RGB值
R G B 值 R G B 值 R G B 值 黑色 0 0 0 #000000 黄色 255 255 0 #FFFF00 浅灰蓝色 176 224 230 #B0E0E6 象牙黑 41 ...
- Android中使用ExpandableListView实现微信通讯录界面(完善仿微信APP)
之前的博文<Android中使用ExpandableListView实现好友分组>我简单介绍了使用ExpandableListView实现简单的好友分组功能,今天我们针对之前的所做的仿微信 ...
- iOS开源项目周报1222
由OpenDigg 出品的iOS开源项目周报第二期来啦.我们的iOS开源周报集合了OpenDigg一周来新收录的优质的iOS开发方面的开源项目,方便iOS开发人员便捷的找到自己需要的项目工具等. io ...
- 给缺少Python项目实战经验的人
我们在学习过程中最容易犯的一个错误就是:看的多动手的少,特别是对于一些项目的开发学习就更少了! 没有一个完整的项目开发过程,是不会对整个开发流程以及理论知识有牢固的认知的,对于怎样将所学的理论知识应用 ...