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。当我打开没有标记的 StorageFile
s 时没有出现这样的问题。
我可以使用正常的文件操作访问此类文件。我可以从它们创建位图,处理它们,工作。
我就是不能让它们成为 XAML Image
.
的来源
有什么想法吗?
啊清晰。
于是原来用DataContextChanged
事件通过Image.SetSource()
刷新位图就是凶器
解决方案:声明一个 BitmapSource
类型的 属性。将 Image.Source
绑定到 属性。在 Image.Loaded
和 Image.DataContextChanged
上用加载的位图更新 属性。现在在我能够测试的所有条件下都能稳定快速地工作。
这个比较难解释,给大家一些真伪代码:
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。当我打开没有标记的 StorageFile
s 时没有出现这样的问题。
我可以使用正常的文件操作访问此类文件。我可以从它们创建位图,处理它们,工作。
我就是不能让它们成为 XAML Image
.
有什么想法吗?
啊清晰。
于是原来用DataContextChanged
事件通过Image.SetSource()
刷新位图就是凶器
解决方案:声明一个 BitmapSource
类型的 属性。将 Image.Source
绑定到 属性。在 Image.Loaded
和 Image.DataContextChanged
上用加载的位图更新 属性。现在在我能够测试的所有条件下都能稳定快速地工作。