UWP中使用Uri构造BitmapImage给Image.Source赋值失效问题咨询
UWP文件激活场景下图片加载失败解决方案
问题根因
- UWP沙箱权限限制:仅应用安装目录(
ms-appx://)、应用数据目录(ms-appdata://)下的文件支持直接通过路径构造Uri加载BitmapImage,其余位置的文件哪怕拿到了本地路径,也没有直接路径访问权限。 - 你测试应用内置资源加载失败的直接原因是代码存在语法错误:
new Uri("ms-appx:///09.png, UriKind.RelativeOrAbsolute)中资源路径末尾缺少闭合双引号,正确写法为new Uri("ms-appx:///09.png", UriKind.RelativeOrAbsolute),同时需确认图片文件的「生成操作」属性设置为内容,「复制到输出目录」设置为如果较新则复制。
可行解决方案
你对文件激活场景的权限逻辑存在误解:通过FileActivatedEventArgs拿到的StorageFile对象本身已经被系统授予访问权限,无需弹出文件选择器,可直接调用OpenAsync打开流加载图片,这是该场景的标准处理方案,适配代码如下:
protected override async void OnNavigatedTo(NavigationEventArgs EvArgs) { base.OnNavigatedTo(EvArgs); var Args = EvArgs.Parameter as Windows.ApplicationModel.Activation.IActivatedEventArgs; if (Args != null && Args.Kind == Windows.ApplicationModel.Activation.ActivationKind.File) { var FArgs = Args as Windows.ApplicationModel.Activation.FileActivatedEventArgs; if (FArgs?.Files?.Count > 0) { var targetFile = FArgs.Files[0]; using var fileStream = await targetFile.OpenAsync(Windows.Storage.FileAccessMode.Read); var bitmap = new BitmapImage(); await bitmap.SetSourceAsync(fileStream); var IMG = new Image() { Source = bitmap }; FV.Items.Add(IMG); PathBlock.Text = $"{targetFile.Name} - Image Viewer"; } } else { PathBlock.Text = "Image Viewer"; } }
注意事项
UWP沙箱不支持任意本地路径的Uri直读,除了上述两个应用专属目录外,所有外部文件必须通过StorageFile流的方式加载,没有绕过该限制的合法方案。
内容的提问来源于stack exchange,提问作者Ivirius
相关产品推荐
相关产品推荐

