J'essaie d'utiliser MVVM pour un projet Windows Universal, mais les interfaces pour le fichier de stockage se plaint beaucoup d'utiliser async. Le code suivant fonctionne parfois:ValueConverter for StorageFile => Image
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;
}
}
Jusqu'à ce que je sélectionne une nouvelle image à charger, je reçois l'erreur « { » L'application appelée une interface qui est attelée pour un thread différent. (Exception de HRESULT: 0x8001010E (RPC_E_WRONG_THREAD)) "}"
J'ai essayé de changer pour utiliser le CoreDispatcher par un autre thread:
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 sur BitmapImage. Cela a un sens absolu pour moi bien sûr - le répartiteur asynchrone cède le contrôle au processus parent, l'image n'a pas été assignée, l'exception de référence nulle. Mais je ne sais pas ce que la bonne façon est!
Un convertisseur de valeur ne doit pas du tout renvoyer un UIElement. Pourquoi pensez-vous que vous avez besoin de quelque chose comme ça? – Clemens
Je voulais obtenir des fichiers d'image potentiellement volumineux et les afficher dans une application, en fournissant des informations sur les pixels et la photographie à leur sujet, donc je ne voulais pas geler l'interface utilisateur en attente de chargement du fichier. –
Toutefois, le convertisseur doit renvoyer une ImageSource (par exemple une image Bitmap), pas un contrôle Image. – Clemens