Migrez des données du dictionnaire des propriétés de l’application Xamarin.Forms vers les préférences MAUI .NET
Xamarin.Forms dispose d’un dictionnaire Properties
que vous pouvez utiliser pour stocker des données et auquel vous pouvez accéder en utilisant la propriété Application.Current.Properties
. Ce dictionnaire utilise une clé string
et stocke une valeur object
. Les valeurs du dictionnaire sont enregistrées dans l’appareil quand une application est suspendue ou arrêtée, et chargées quand une application redémarre ou est renvoyée à partir de l’arrière-plan. Pour obtenir plus d’informations sur le dictionnaire des propriétés, consultez Dictionnaire des propriétés.
Lorsque vous migrez une application Xamarin.Forms stockant des données dans le dictionnaire des propriétés de l’application vers .NET MAUI, vous devez migrer ces données vers les préférences .NET MAUI. Vous pouvez effectuer cette opération avec la classe LegacyApplication
, et des classes d’assistance, qui est présentée dans cet article. Cette classe permet à votre application .NET MAUI sur Android, iOS et Windows de lire des données à partir du dictionnaire des propriétés de l’application créé avec une version Xamarin.Forms précédente de votre application. Si vous souhaitez obtenir plus d’informations sur les préférences .NET MAUI, consultez Préférences.
Important
Il n’existe aucune API pour accéder au dictionnaire de propriétés d’application dans .NET MAUI.
Migrer des données de propriétés d’application héritées
Le code suivant montre la classe LegacyApplication
qui offre un accès aux données des propriétés d’application créées par votre application Xamarin.Forms :
Remarque
Pour utiliser ce code, ajoutez-le à une classe nommée LegacyApplication
dans votre projet d’application .NET MAUI.
namespace MigrationHelpers;
public class LegacyApplication
{
readonly PropertiesDeserializer deserializer;
Task<IDictionary<string, object>>? propertiesTask;
static LegacyApplication? current;
public static LegacyApplication? Current
{
get
{
current ??= (LegacyApplication)Activator.CreateInstance(typeof(LegacyApplication));
return current;
}
}
public LegacyApplication()
{
deserializer = new PropertiesDeserializer();
}
public IDictionary<string, object> Properties
{
get
{
propertiesTask ??= GetPropertiesAsync();
return propertiesTask.Result;
}
}
async Task<IDictionary<string, object>> GetPropertiesAsync()
{
IDictionary<string, object> properties = await deserializer.DeserializePropertiesAsync().ConfigureAwait(false);
properties ??= new Dictionary<string, object>(4);
return properties;
}
}
Android
Sur Android, la classe LegacyApplication
utilise la classe PropertiesDeserializer
pour désérialiser des données à partir du fichier du dictionnaire de propriétés d’application. Le code suivant illustre la classe PropertiesDeserializer
:
Remarque
Pour utiliser ce code, ajoutez-le à une classe nommée PropertiesDeserializer
dans le dossier Platforms\Android de votre projet d’application .NET MAUI.
using System.Diagnostics;
using System.IO.IsolatedStorage;
using System.Runtime.Serialization;
using System.Xml;
namespace MigrationHelpers;
public class PropertiesDeserializer
{
const string PropertyStoreFile = "PropertyStore.forms";
public Task<IDictionary<string, object>> DeserializePropertiesAsync()
{
// Deserialize property dictionary to local storage
return Task.Run(() =>
{
using (IsolatedStorageFile store = IsolatedStorageFile.GetUserStoreForApplication())
{
if (!store.FileExists(PropertyStoreFile))
return null;
using (IsolatedStorageFileStream stream = store.OpenFile(PropertyStoreFile, FileMode.Open, FileAccess.Read))
using (XmlDictionaryReader reader = XmlDictionaryReader.CreateBinaryReader(stream, XmlDictionaryReaderQuotas.Max))
{
if (stream.Length == 0)
return null;
try
{
var dcs = new DataContractSerializer(typeof(Dictionary<string, object>));
return (IDictionary<string, object>)dcs.ReadObject(reader);
}
catch (Exception e)
{
Debug.WriteLine("Could not deserialize properties: " + e.Message);
Console.WriteLine($"PropertyStore Exception while reading Application properties: {e}");
}
}
}
return null;
});
}
}
iOS
Sur iOS, la classe LegacyApplication
utilise la classe PropertiesDeserializer
pour désérialiser des données à partir du fichier du dictionnaire de propriétés d’application. Le code suivant illustre la classe PropertiesDeserializer
:
Remarque
Pour utiliser ce code, ajoutez-le à une classe nommée PropertiesDeserializer
dans le dossier Platforms\iOS de votre projet d’application .NET MAUI.
using System.Diagnostics;
using System.IO.IsolatedStorage;
using System.Runtime.Serialization;
using System.Xml;
namespace MigrationHelpers;
public class PropertiesDeserializer
{
const string PropertyStoreFile = "PropertyStore.forms";
public Task<IDictionary<string, object>> DeserializePropertiesAsync()
{
// Deserialize property dictionary to local storage
return Task.Run(() =>
{
using (var store = IsolatedStorageFile.GetUserStoreForApplication())
using (var stream = store.OpenFile(PropertyStoreFile, System.IO.FileMode.OpenOrCreate))
using (var reader = XmlDictionaryReader.CreateBinaryReader(stream, XmlDictionaryReaderQuotas.Max))
{
if (stream.Length == 0)
return null;
try
{
var dcs = new DataContractSerializer(typeof(Dictionary<string, object>));
return (IDictionary<string, object>)dcs.ReadObject(reader);
}
catch (Exception e)
{
Debug.WriteLine("Could not deserialize properties: " + e.Message);
Console.WriteLine($"PropertyStore Exception while reading Application properties: {e}");
}
}
return null;
});
}
}
Windows
Sur Windows, la classe LegacyApplication
utilise la classe PropertiesDeserializer
pour désérialiser des données à partir du fichier du dictionnaire de propriétés d’application. Le code suivant illustre la classe PropertiesDeserializer
:
Remarque
Pour utiliser ce code, ajoutez-le à une classe nommée PropertiesDeserializer
dans le dossier Platforms\Windows de votre projet d’application .NET MAUI.
using System.Diagnostics;
using System.Runtime.Serialization;
using Windows.Storage;
namespace MigrationHelpers;
public class PropertiesDeserializer
{
const string PropertyStoreFile = "PropertyStore.forms";
public async Task<IDictionary<string, object>> DeserializePropertiesAsync()
{
try
{
StorageFile file = await ApplicationData.Current.RoamingFolder.GetFileAsync(PropertyStoreFile).DontSync();
using (Stream stream = (await file.OpenReadAsync().DontSync()).AsStreamForRead())
{
if (stream.Length == 0)
return new Dictionary<string, object>(4);
try
{
var serializer = new DataContractSerializer(typeof(IDictionary<string, object>));
return (IDictionary<string, object>)serializer.ReadObject(stream);
}
catch (Exception e)
{
Debug.WriteLine("Could not deserialize properties: " + e.Message);
Console.WriteLine($"PropertyStore Exception while reading Application properties: {e}");
}
return null;
}
}
catch (FileNotFoundException)
{
return new Dictionary<string, object>(4);
}
}
}
La version Windows de la classe PropertiesDeserializer
nécessite la méthode d’extension DontSync
. Le code suivant montre cette méthode d’extension :
Remarque
Pour utiliser ce code, ajoutez-le à une classe nommée Extensions
dans le dossier Platforms\Windows de votre projet d’application .NET MAUI.
using System.Runtime.CompilerServices;
using Windows.Foundation;
namespace MigrationHelpers;
internal static class Extensions
{
public static ConfiguredTaskAwaitable<T> DontSync<T>(this IAsyncOperation<T> self)
{
return self.AsTask().ConfigureAwait(false);
}
}
Consommer des données de propriétés d’application héritées
Vous pouvez utiliser la classe LegacyApplication
pour consommer des données à partir du dictionnaire des propriétés de l’application, sur Android, iOS et Windows, créé avec une version Xamarin.Forms précédente de votre application :
#if ANDROID || IOS || WINDOWS
using MigrationHelpers;
...
int id;
if (LegacyApplication.Current.Properties.ContainsKey("id"))
{
id = (int)LegacyApplication.Current.Properties["id"];
Preferences.Set("id", id);
}
#endif
Cet exemple montre l’utilisation de la classe LegacyApplication
pour lire une valeur du dictionnaire des propriétés de l’application et ensuite écrire la valeur dans les préférences .NET MAUI.
Important
Vérifiez toujours la présence de la clé dans le dictionnaire des propriétés de l’application avant d’y accéder afin d’éviter des erreurs inattendues.