UWP 应用程序:`Image.SetSource` 将计算机挂在 `KnownPlaces` 之外的 `StorageFiles` 上

UWP App: `Image.SetSource` hangs computer on `StorageFiles` outside of `KnownPlaces`

这个比较难解释,给大家一些真伪代码:

try
{
   // If source (a string) points towards a file that is available with 
   // StorageFile.GetFileFromPathAsync(), just open the file that way.
   // If that is not possible, use the path to look up an Access Token
   // and use the file from the StorageFolder gotten via that token.

   StorageFile file = await GetFileFromAccessList(source);

   if (file != null)
   {
      bitmap = new BitmapImage();
      using (IRandomAccessStream fileStream = await file.OpenAsync(FileAccessMode.Read))
      {
          await bitmap.SetSourceAsync(fileStream);
      }
   }
}
catch (Exception e)
{
   string s = e.Message;
   bitmap = null;
}

使用以下方法:

    public async Task<StorageFile> GetFileFromAccessList(string path)
    {
        StorageFile result = null;

        if (String.IsNullOrEmpty(path) == false)
            try
            {
                // Try to access to file directly...
                result = await StorageFile.GetFileFromPathAsync(path);

            }
            catch (Exception)
            {
                result = null;
                try
                {
                    // See if the folder this thing is in is in the access list...
                    StorageFolder folder = await GetFolderFromAccessList(Path.GetFullPath(path));

                    // If there is a folder, try that.
                    if (folder != null)
                        result = await folder.GetFileAsync(Path.GetFileName(path));
                }
                catch (Exception)
                {
                    result = null;
                }
            }

        return result;
    }

生成的位图在 Image.SetSource() 中用作 ImageSource

现在是什么杀死了我:对于存储在应用程序文件夹或 KnownFolders. 中的文件,此调用完美、快速且坚如磐石,因此当我不需要访问令牌。 Windows.Storage.AccessCache.StorageApplicationPermissions.FutureAccessList.GetFolderAsync(token)

但是,如果我必须使用访问令牌,它就会中断,只是不会一直这样 此代码不会立即中断:当我尝试同时打开超过 5-7 个源文件时它会中断。 重复一遍:如果我显示 5-7 张图像,这会起作用。如果我尝试打开更多,它会冻结 PC。当我打开没有标记的 StorageFiles 时没有出现这样的问题。

我可以使用正常的文件操作访问此类文件。我可以从它们创建位图,处理它们,工作。 我就是不能让它们成为 XAML Image.

的来源

有什么想法吗?

啊清晰。 于是原来用DataContextChanged事件通过Image.SetSource()刷新位图就是凶器

解决方案:声明一个 BitmapSource 类型的 属性。将 Image.Source 绑定到 属性。在 Image.LoadedImage.DataContextChanged 上用加载的位图更新 属性。现在在我能够测试的所有条件下都能稳定快速地工作。