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.