Freigeben über


Migrieren von Daten aus dem Eigenschaftenverzeichnis der Xamarin.Forms-App zu .NET MAUI-Einstellungen

Xamarin.Forms verfügt über ein Properties Wörterbuch, das zum Speichern von Daten verwendet werden kann und auf das mithilfe der Application.Current.Properties Eigenschaft zugegriffen wird. Dieses Wörterbuch verwendet einen string Schlüssel und speichert einen object Wert. Die Werte im Wörterbuch werden auf dem Gerät gespeichert, wenn eine App angehalten oder heruntergefahren wird, und geladen, wenn eine App neu gestartet oder aus dem Hintergrund zurückkehrt. Weitere Informationen zum Eigenschaftenwörterbuch finden Sie im Eigenschaftenwörterbuch.

Beim Migrieren einer Xamarin.Forms-App, die Daten im App-Eigenschaftenwörterbuch zu .NET MAUI speichert, sollten Sie diese Daten zu .NET MAUI-Einstellungen migrieren. Dies kann mit den LegacyApplication Klassen und Hilfsklassen erreicht werden, die in diesem Artikel vorgestellt werden. Mit dieser Klasse kann Ihre .NET MAUI-App unter Android, iOS und Windows Daten aus dem App-Eigenschaftenwörterbuch lesen, das mit einer früheren Xamarin.Forms-Version Ihrer App erstellt wurde. Weitere Informationen zu .NET MAUI-Einstellungen finden Sie unter "Einstellungen".

Von Bedeutung

Es gibt keine API für den Zugriff auf das App-Eigenschaftenwörterbuch in .NET MAUI.

Zugreifen auf Legacy-App-Eigenschaftendaten

Der folgende Code zeigt die LegacyApplication Klasse, die Zugriff auf die App-Eigenschaftendaten bietet, die von Ihrer Xamarin.Forms-App erstellt wurden:

Hinweis

Um diesen Code zu verwenden, fügen Sie ihn einer Klasse hinzu, die in Ihrem .NET MAUI-App-Projekt benannt ist LegacyApplication .

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

Unter Android verwendet die LegacyApplication-Klasse die PropertiesDeserializer-Klasse, um Daten aus der Eigenschaftsdatei der App zu deserialisieren. Der folgende Code zeigt die PropertiesDeserializer-Klasse:

Hinweis

Um diesen Code zu verwenden, fügen Sie ihn zu einer Klasse hinzu, die im Ordner PropertiesDeserializer" Ihres .NET MAUI-App-Projekts benannt ist.

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

Unter iOS verwendet die LegacyApplication Klasse die PropertiesDeserializer Klasse, um Daten aus der Wörterbuchdatei der App-Eigenschaften zu deserialisieren. Der folgende Code zeigt die PropertiesDeserializer-Klasse:

Hinweis

Um diesen Code zu verwenden, fügen Sie ihn einer Klasse hinzu, die im Ordner PropertiesDeserializer" Ihres .NET MAUI-App-Projekts benannt ist.

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

Unter Windows verwendet die LegacyApplication Klasse die PropertiesDeserializer Klasse, um Daten aus der Wörterbuchdatei der App-Eigenschaften zu deserialisieren. Der folgende Code zeigt die PropertiesDeserializer-Klasse:

Hinweis

Um diesen Code zu verwenden, fügen Sie ihn einer Klasse hinzu, die im Ordner PropertiesDeserializer" Ihres .NET MAUI-App-Projekts benannt ist.

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

Für diese Windows-Version der PropertiesDeserializer Klasse ist die DontSync Erweiterungsmethode erforderlich. Der folgende Code zeigt diese Erweiterungsmethode:

Hinweis

Um diesen Code zu verwenden, fügen Sie ihn einer Klasse hinzu, die im Ordner Extensions" Ihres .NET MAUI-App-Projekts benannt ist.

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

Verwenden von Legacy-App-Eigenschaftsdaten

Die LegacyApplication Klasse kann verwendet werden, um Daten aus dem App-Eigenschaftenwörterbuch unter Android, iOS und Windows zu nutzen, das mit einer vorherigen Xamarin.Forms-Version Ihrer App erstellt wurde:

#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

Dieses Beispiel zeigt die Verwendung der LegacyApplication Klasse zum Lesen eines Werts aus dem App-Eigenschaftenwörterbuch und anschließendes Schreiben des Werts in .NET MAUI-Einstellungen.

Von Bedeutung

Überprüfen Sie immer, ob der Schlüssel im App-Eigenschaftenverzeichnis vorhanden ist, bevor Sie darauf zugreifen, um unerwartete Fehler zu vermeiden.