我正在尝试从StorageFile
中选择FilePicker
后显示图像。由于Source
的{{1}}必须是Image
或URI
,因此我尝试从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
答案 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