Partager via


Migrer des données du dictionnaire de propriétés de l’application Xamarin.Forms vers les préférences MAUI .NET

Xamarin.Forms a un Properties dictionnaire qui peut être utilisé pour stocker des données et qui est accessible à l’aide de la Application.Current.Properties propriété. Ce dictionnaire utilise une string clé et stocke une object valeur. Les valeurs du dictionnaire sont enregistrées sur l’appareil lorsqu’une application est suspendue ou arrêtée, et chargées lorsqu’une application est redémarrée ou retournée à partir de l’arrière-plan. Pour plus d’informations sur le dictionnaire de propriétés, consultez Dictionnaire de propriétés.

Lors de la migration d’une application Xamarin.Forms qui stocke 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 MAUI .NET. Cette opération peut être effectuée avec la LegacyApplication classe et les classes d’assistance, qui sont présentées dans cet article. Cette classe permet à votre application .NET MAUI sur Android, iOS et Windows de lire des données à partir du dictionnaire de propriétés de l’application qui a été créé avec une version antérieure de Xamarin.Forms de votre application. Pour 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 des propriétés de l’application dans .NET MAUI.

Accéder aux données de propriétés d’application héritées

Le code suivant montre la LegacyApplication classe, qui fournit l’accès aux données des propriétés de l’application créées par votre application Xamarin.Forms :

Note

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 LegacyApplication classe utilise la PropertiesDeserializer classe pour désérialiser les données à partir du fichier de dictionnaire de propriétés de l’application. Le code suivant illustre la classe PropertiesDeserializer :

Note

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 LegacyApplication classe utilise la PropertiesDeserializer classe pour désérialiser les données à partir du fichier de dictionnaire de propriétés de l’application. Le code suivant illustre la classe PropertiesDeserializer :

Note

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;
        });
    }
}

Fenêtres

Sur Windows, la LegacyApplication classe utilise la PropertiesDeserializer classe pour désérialiser les données à partir du fichier de dictionnaire de propriétés de l’application. Le code suivant illustre la classe PropertiesDeserializer :

Note

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);
        }
    }
}

Cette version Windows de la PropertiesDeserializer classe nécessite la méthode d’extension DontSync . Le code suivant montre cette méthode d’extension :

Note

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 les données de propriété d'application héritées

La LegacyApplication classe peut être utilisée pour consommer des données à partir du dictionnaire des propriétés de l’application, sur Android, iOS et Windows, qui a été créée avec une version précédente de Xamarin.Forms 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 comment utiliser la LegacyApplication classe pour lire une valeur à partir du dictionnaire des propriétés de l’application, puis écrire la valeur dans les préférences MAUI .NET.

Important

Vérifiez toujours la présence de la clé dans le dictionnaire des propriétés de l’application avant de l’accéder, afin d’éviter les erreurs inattendues.