这个很难解释,所以我给你一些实际和伪代码:
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
。
现在是什么让我失望了:此调用对于存储在apps文件夹或KnownFolders
中的文件完美,快速且坚如磐石。因此,当我不喜欢时,它就像一个魅力。需要一个访问令牌。 Windows.Storage.AccessCache.StorageApplicationPermissions.FutureAccessList.GetFolderAsync(token)
然而,如果我必须使用访问令牌,它就会中断,但并非总是如此
此代码不会立即中断:当我尝试同时打开5-7个源文件时,它会中断。
重复一遍:如果我显示5-7张图像,这是有效的。如果我尝试打开更多,它会冻结PC。当我打开没有令牌的StorageFile
时,不会出现这样的问题。
我可以使用普通文件操作访问这些文件。我可以从它们创建位图,处理它们,工作。
我无法将它们作为XAML的来源Image
。
有什么想法吗?
答案 0 :(得分:0)
啊清晰度。
事实证明,使用DataContextChanged
事件通过Image.SetSource()
刷新位图是谋杀武器。
解决方案:声明类型为BitmapSource
的属性。将Image.Source
绑定到该属性。使用Image.Loaded
和Image.DataContextChanged
上加载的位图更新属性。在我能够测试的所有条件下,现在工作稳定而快速。