引子:
很久以前,看到windows自带应用,邮件使用图片作为背景,感觉很好看.你看连微软自家的应用都不用亚克力了😅
然后我就给我的一个app <课程表uwp>添加了一个功能,使用图片作为背景,
我下载了几个图片可供用户选择作为app背景,后来有用户评论说:"你的那几个图片都不好看,想自己设置图片"
然后我增加了一个选择图片作为壁纸的功能.
当初实现的方式有点问题,每次自己设置都会闪退😄....然后1年过去了
---
回到现在:我前几天更新修复了这个功能(ಥ _ ಥ)
========
内容:
之前闪退的原因,因为我使用安装包内的资源文件图片作为背景,如果自定义,我的设想是通过用户选择自己替换掉这些资源图片.然而....安装包内的资源文件并没用写入权限.所以闪退.
所以如果允许用户自定义背景图片,大概就是做法就是下边这样:
private async void UserDefine_Click(object sender, RoutedEventArgs e) { // 选择一个图片作为壁纸 //AppSettings setting = new AppSettings(); // 让用户选取一个图片文件 FileOpenPicker fPicker = new FileOpenPicker(); fPicker.FileTypeFilter.Add(".jpg"); fPicker.FileTypeFilter.Add(".jpeg"); fPicker.FileTypeFilter.Add(".png"); fPicker.FileTypeFilter.Add(".bmp"); var file = await fPicker.PickSingleFileAsync(); if (file != null) { // string mruToken = Windows.Storage.AccessCache.StorageApplicationPermissions.MostRecentlyUsedList.Add(file); AppSettings.WriteSetting<string>("skin", mruToken); // Add to FA without metadata //var faToken1 = StorageApplicationPermissions.FutureAccessList.Add(selectedFile); //setting.BackgroundImgToken = mruToken; //AppSettings.WriteSetting<string>("skin", index.ToString()); var SkinImageBrush = new ImageBrush(); //BitmapImage bimg = new BitmapImage(); Debug.WriteLine($"图片文件路径{file.Path}"); //bimg.UriSource = new Uri(file.Path); //SkinImageBrush.ImageSource = bimg; using (IRandomAccessStream ir = await file.OpenAsync(FileAccessMode.Read)) { BitmapImage bi = new BitmapImage(); await bi.SetSourceAsync(ir); SkinImageBrush.ImageSource = bi; } //替换壁纸 ChangeSkinAction(SkinImageBrush); } }