这非常令人烦恼。 我正在开发一个用于图像管理的应用程序。部分价值是基于图像属性在子文件夹中存储图像的能力,例如。创作日期。
如果我将图像源存储在浅文件夹(app \ images \ img.jpg)中,一切正常。 如果我将图像存储在KnownFolders.Pictures \ source \ year \ month \ day \ img.jpg中,则图像不会渲染。 (是的,那条特定的路径不会起作用,我试图让你了解路径是如何构建的)......
文件实际上就在那里。路径是正确的(我可以在浏览器中打开它,例如)。该应用有权访问该文件。 但它不会渲染位图。
我尝试使用
手动渲染位图new BitmapImage(new Uri("KnownFolders.Pictures\source\year\month\day\img.jpg"),UriKind.Absolute))
这不会呈现任何东西。 (再次假设路径有效且底部有文件)。
我想念的是什么?
头部划痕:对于GIF动画,我使用的是Thomas Levesque的有用组件:https://github.com/XamlAnimatedGif。不幸的是,那个只渲染了GIF ......即使路径是上面给出的路径也是如此。因此标准IMAGE控件无法正确呈现,但托马斯的控件确实......令人愤怒。
答案 0 :(得分:0)
UWP应用无法将绝对URL中的BitmapImage加载到图片库文件夹下面的文件夹结构中的文件。
所以这不会起作用:
var relativePath = @"source\year\month\day\img.jpg";
var imageFile = await KnownFolders.PicturesLibrary.GetFileAsync(relativePath);
var bitmapImage = new BitmapImage(new Uri(imageFile.Path));
但是,你可以这样做:
var relativePath= @"source\year\month\day\img.jpg";
var imageFile = await KnownFolders.PicturesLibrary.GetFileAsync(relativePath);
var bitmapImage = new BitmapImage();
using (var stream = await imageFile.OpenAsync(FileAccessMode.Read))
{
await bitmapImage.SetSourceAsync(stream);
}
答案 1 :(得分:-1)
所以,经过太多时间花在这上面......
首先,链接到IMAGE元素的DataContextChanged
。在那里,解析DataContext。 如果您在ItemsControl等之外使用IMAGE,则不需要...
private async void ImageView_DataContextChanged(FrameworkElement sender, DataContextChangedEventArgs args)
{
if (sender is Image)
{
Image img = (Image)sender;
if (img.DataContext is ImageView)
{
MyViewDataContext dc = (MyViewDataContext)img.DataContext;
img.Source = await dc.bitmap();
}
}
}
这里是MyViewDataContext.bitmap()的实现,它有一个叫做source的属性,你猜对了绝对路径:
public async Task<BitmapImage> MyViewDataContext.bitmap()
{
if (_bitmap == null)
{
try
{
StorageFile file = await StorageFile.GetFileFromPathAsync(source);
bool r = Windows.Storage.AccessCache.StorageApplicationPermissions.FutureAccessList.CheckAccess(file);
if (r)
{
using (IRandomAccessStream fileStream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read))
{
// create a new bitmap, coz the old one must be done for...
_bitmap = new BitmapImage();
// And get that bitmap sucked in from stream.
await _bitmap.SetSourceAsync(fileStream);
}
}
}
catch (Exception e)
{
_bitmap = null;
}
}
return _bitmap;
}
BitmapImage _bitmap;
我缓存生成的位图,直到我处理掉这个MyViewDataContext。
我现在最关心记忆。这个让我担心: How to dispose BitmapImage cache?
所以,作为一个技术债务,我将在以后解决潜在的内存泄漏问题,一旦整个问题出现在测试平台上,我就可以看看它的运行时行为...
答案 2 :(得分:-1)
要访问此类属性所代表的文件夹和库,请在应用清单中指定相应的功能。例如,要访问KnownFolders.PicturesLibrary,请在应用清单中指定图片库功能。
希望这会有所帮助 James