我想为通用Windows项目使用MVVM,但存储文件的接口抱怨了很多关于使用异步。下面的代码,有时作品:ValueConverter for StorageFile =>图像
public object Convert(object value, Type targetType, object parameter, string language)
{
var storageFile = value as StorageFile;
return GetImageAsync(storageFile).Result;
}
private static async Task<ImageSource> GetImageAsync(StorageFile storageFile)
{
var bitmapImage = new BitmapImage();
var stream = await storageFile.OpenAsync(FileAccessMode.Read).AsTask().ConfigureAwait(false);
bitmapImage.SetSource(stream);
return bitmapImage;
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
return null;
}
}
直到我选择一个新的图像加载,然后我得到了错误“{”的应用程序调用这是编组为一个不同的线程的接口。 (异常来自HRESULT:0x8001010E(RPC_E_WRONG_THREAD)) “}”
所以我试图改变它时使用的每另一个线程CoreDispatcher:
public class FileToImageConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
var storageFile = value as StorageFile;
Task<ImageSource> image = null;
Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() =>
{
image = GetImageAsync(storageFile);
image.RunSynchronously();
});
return image.Result;
}
private static async Task<ImageSource> GetImageAsync(StorageFile storageFile)
{
var bitmapImage = new BitmapImage();
var stream = await storageFile.OpenAsync(FileAccessMode.Read).AsTask().ConfigureAwait(false);
bitmapImage.SetSource(stream);
return bitmapImage;
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
return null;
}
}
的NullReferenceException上的BitmapImage。这对我来说绝对有意义 - 异步调度器将控制权交给父进程,图像尚未分配,空引用异常。但我不知道什么是正确的方法!
一个值转换器不应该返回一个UIElement。你为什么觉得你需要这样的事? – Clemens
我想要获取潜在的大型图像文件并将它们显示在应用程序中,提供关于它们的像素/摄影信息,所以我不想冻结等待文件加载的UI。 –
不过,转换器应该返回一个ImageSource(例如BitmapImage),而不是Image控件。 – Clemens