首页 文章

如何在Windows Universal App中显示网络文件夹或本地驱动器中的图像

提问于
浏览
3

我在Windows通用应用程序的图像控件中显示jpg时遇到问题 . (我在尝试创建Windows 8商店应用时遇到了同样的问题)

我有一个带有Image控件的简单表单 . 我想要做的就是能够打开本地驱动器上的文件夹或本地网络上的网络驱动器中的图像并显示它们 . 但我没有运气 . 我唯一得到的是E_NETWORK_ERROR,没有其他信息 .

我认为它可能与安全有关,但肯定必须有一个设置或许可允许我这样做 . 我尝试在清单的功能选项卡中启用专用网络,但这没有帮助 . 我没有在声明中看到任何听起来像我需要的东西 .

我知道UWP应用程序有点沙盒,但如果你甚至无法访问本地文件,它们有什么用呢?

这是我尝试过的代码示例 . 我也完成了其他迭代,但它们都有相同的最终结果 .

XAML:

<Image Name="Image1"/>

代码背后:

public LoadImage()
    {
        var bitmap = new BitmapImage();
        bitmap.ImageFailed += Bitmap_ImageFailed;
        bitmap.UriSource = new Uri(@"D:\Users\Steve\Documents\SomeImage.JPG", UriKind.Absolute);
        Image1.Source = bitmap;
    }

    private void Bitmap_ImageFailed(object sender, ExceptionRoutedEventArgs e)
    {
        Debug.Write(e.ErrorMessage);
    }

当我运行它时,我最终在Bitmap_ImageFailed事件中,而ErrorMessage属性只是“E_NETWORK_ERROR”,并且图像中没有显示任何内容 . 不是很有帮助 .

我错过了什么?它必须是一个简单而明显的东西,我在俯视 .

更新:

感谢这里的所有建议,我能够顺利实现 . 我没有通过我的头骨的部分是你不能只是给它一个文件夹,并期望它读取文件,即使是“快速和肮脏的测试” . 你必须经过“适当的渠道”才能到达那里 . 我将它拼凑在一起并想出了这个示例,它显示了所选文件夹中的第一个图像:

private async void Button_Click(object sender, RoutedEventArgs e)
    {
        FolderPicker folderPicker = new FolderPicker();
        folderPicker.SuggestedStartLocation = PickerLocationId.Desktop;
        folderPicker.FileTypeFilter.Add(".jpg");
        folderPicker.FileTypeFilter.Add(".tif");
        folderPicker.FileTypeFilter.Add(".png");

        StorageFolder folder = await folderPicker.PickSingleFolderAsync();
        if (folder != null)
        {
            StorageApplicationPermissions.FutureAccessList.AddOrReplace("PickedFolderToken", folder);
            var files = await folder.GetFilesAsync();

            var bitmap = new BitmapImage();
            bitmap.ImageFailed += Bitmap_ImageFailed;
            var stream = await files.First().OpenReadAsync();
            await bitmap.SetSourceAsync(stream);
            Image1.Source = bitmap;
        }
    }

另外,我必须将.jpg,.tif和.png以及File Open Picker的文件类型添加到声明中 .

1 回答

  • 3

    你可以在MSDN文章中找出所有必要的信息File access permissions

    除了默认位置,应用程序还可以通过在应用程序清单中声明功能(请参阅App capability declarations)或通过调用文件选择器来让用户选择要访问的应用程序的文件和文件夹来访问其他文件和文件夹(请参阅Open files and folders with a picker) .

    因此,如果要从用户文档文件夹中读取文件,则需要更新应用程序AppXManifest以请求Document Library Access capability .

    您还需要通过声明要访问的文件类型来更新AppXManifest . 然后,即使访问文件夹,您也只能访问一组有限的文件类型 . 您必须在声明选项卡上指定支持的文件类型

    enter image description here

    我设置了一个新的文件类型(.txt)并从那里让它角色 . 和代码示例

    async void Button_Click_2(object sender, RoutedEventArgs e)
    {
        var _Name = "HelloWorld.txt";
        var _Folder = KnownFolders.DocumentsLibrary;
        var _Option = Windows.Storage.CreationCollisionOption.ReplaceExisting;
    
        // create file 
        var _File = await _Folder.CreateFileAsync(_Name, _Option);
    
        // write content
        var _WriteThis = "Hello world!";
        await Windows.Storage.FileIO.WriteTextAsync(_File, _WriteThis);
    
        // acquire file
        try { _File = await _Folder.GetFileAsync(_Name); }
        catch (FileNotFoundException) { /* TODO */ }
    
        // read content
        var _Content = await FileIO.ReadTextAsync(_File);
        await new Windows.UI.Popups.MessageDialog(_Content).ShowAsync();
    }
    

相关问题