WinRT将Image绑定到字符串或StorageFile

时间:2015-01-21 06:25:36

标签: c# xaml windows-runtime

我正在尝试从StorageFile中选择FilePicker后显示图像。由于Source的{​​{1}}必须是ImageURI,因此我尝试从ImageSource获取其中任何一个。

我很难让数据绑定在XAML中的StorageFile上工作。我尝试过以下方法:

Image

这种方式不起作用,因为<Image Width="300" Height="300" x:Name="LogoImage"> <Image.Source> <BitmapImage UriSource="{Binding ImagePath}" /> </Image.Source> </Image> 的{​​{1}}属性不是Path。另外,我无法直接绑定到StorageFile本身,因为它不是URI

我尝试使用这种方法:

StorageFile

但是,它会返回ImageSource,这也不是public async Task<Image> GetImageAsync(StorageFile storageFile) { BitmapImage bitmapImage = new BitmapImage(); FileRandomAccessStream stream = (FileRandomAccessStream)await storageFile.OpenAsync(FileAccessMode.Read); bitmapImage.SetSource(stream); Image image = new Image(); image.Source = bitmapImage; return image; } Task<Image>。看起来它应该比我想做的更直接,但我只是没有看到它。另外,我尝试在ImageSource的XAML中指定一个文件,它运行正常。我根本无法根据URI中的所选文件将其链接起来。

我的最终目标是:从Image.Source中选择一个文件,更新显示的FilePicker的{​​{1}},编码为base64以存储在数据库中。然后,从数据库加载现有的base64字符串,转换回FilePicker进行显示。

修改

我能够使用下面发布的解决方案完成此任务。非常感谢Jerry Nixon的博客文章:http://blog.jerrynixon.com/2014/11/reading-and-writing-base64-in-windows.html

2 个答案:

答案 0 :(得分:2)

最好的解决方案是在代码后面设置源代码而不是使用绑定,因为它可以让你在上一个图像仍然加载的情况下更新ImagePath时处理取消等事情。

或者,您可以创建一个位图,启动加载它的任务并在该任务完成之前返回,例如

public Image GetImage(StorageFile storageFile)
{
    var bitmapImage = new BitmapImage();
    GetImageAsync(bitmapImage, storageFile);

    // Create an image or return a bitmap that's started loading
    var image = new Image();
    image.Source = bitmapImage;

    return image ;
}

private async Task GetImageAsync(BitmapImage bitmapImage, StorageFile storageFile)
{
    using (var stream = (FileRandomAccessStream)await storageFile.OpenAsync(FileAccessMode.Read))
    {
        await bitmapImage.SetSource(stream);
    }
}

答案 1 :(得分:0)

如果有其他人遇到这个问题寻找答案,我最终为我的情况做了什么,就是从StorageFile中选择FilePicker,将其编码为base64字符串(我将保存到我的数据库以供以后检索)。

一旦我有了base64字符串,我就可以将该字符串解码为ImageSource以设置代码隐藏。这是我的完整ButtonClick事件处理程序:

private async void ChooseImage_Click(object sender, RoutedEventArgs e)
{
    var filePicker = new FileOpenPicker();
    filePicker.FileTypeFilter.Add(".jpg");
    filePicker.ViewMode = PickerViewMode.Thumbnail;
    filePicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
    filePicker.SettingsIdentifier = "picker1";
    filePicker.CommitButtonText = "Open File to Process";

    var files = await filePicker.PickMultipleFilesAsync();

    if (files.Count > 0)
    {
        // encode the storage file to base64
        var base64 = await Encoding.ToBase64(files[0]);

        // asynchronously save base64 string to database
        // ...

        // decode the base64 and set the image source
        LogoImage.Source = await Encoding.FromBase64(base64);
    }
}

我在Jerry Nixon的博客上找到了base64编码/解码:http://blog.jerrynixon.com/2014/11/reading-and-writing-base64-in-windows.html