XAML图像源在显示深层嵌套路径时出现问题

时间:2017-03-01 17:31:02

标签: image uwp winrt-xaml

这非常令人烦恼。 我正在开发一个用于图像管理的应用程序。部分价值是基于图像属性在子文件夹中存储图像的能力,例如。创作日期。

如果我将图像源存储在浅文件夹(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控件无法正确呈现,但托马斯的控件确实......令人愤怒。

3 个答案:

答案 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