Freigeben über


Migrieren von Daten aus dem Wörterbuch für die App-Eigenschaften von Xamarin.Forms in .NET MAUI-Einstellungen

Xamarin.Forms verfügt über ein Properties-Wörterbuch, das zum Speichern von Daten verwendet werden kann und auf das mit der Eigenschaft Application.Current.Properties zugegriffen wird. Das Verzeichnis 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 wird, wenn eine App neu gestartet oder aus dem Hintergrund zurückgegeben wird. Weitere Informationen über das Eigenschaftswörterbuch finden Sie unter Eigenschaftswörterbuch.

Wenn Sie eine Xamarin.Forms-App, die Daten im App-Eigenschaftenwörterbuch speichert, nach .NET MAUI migrieren, sollten Sie diese Daten in die .NET MAUI-Einstellungen migrieren. Dies kann mit der Klasse LegacyApplication und Hilfsklassen erreicht werden, die in diesem Element vorgestellt werden. Diese Klasse ermöglicht es Ihrer .NET MAUI-App auf Android, iOS und Windows, Daten aus dem App-Eigenschaften-Wörterbuch zu lesen, das mit einer früheren Xamarin.Forms-Version Ihrer App erstellt wurde. Weitere Informationen über .NET MAUI-Einstellungen finden Sie unter Einstellungen.

Wichtig

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 Klasse LegacyApplication, die den Zugriff auf die von Ihrer Xamarin.Forms-App erstellten App-Eigenschaftsdaten ermöglicht:

Hinweis

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

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 Klasse LegacyApplication die Klasse PropertiesDeserializer zur Deserialisierung von Daten aus der App-Eigenschaften-Wörterbuchdatei. Der folgende Code zeigt die PropertiesDeserializer-Klasse:

Hinweis

Um diesen Code zu verwenden, fügen Sie ihn zu einer Klasse mit dem Namen PropertiesDeserializer im Ordner Platforms\Android Ihres .NET MAUI-App-Projekts hinzu.

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 Klasse LegacyApplication die Klasse PropertiesDeserializer, 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 mit dem Namen PropertiesDeserializer im Ordner Platforms\iOS Ihres .NET MAUI-App-Projekts hinzu.

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 Klasse LegacyApplication die Klasse PropertiesDeserializer, um Daten aus der Wörterbuchdatei für App-Eigenschaften zu deserialisieren. Der folgende Code zeigt die PropertiesDeserializer-Klasse:

Hinweis

Um diesen Code zu verwenden, fügen Sie ihn zu einer Klasse namens PropertiesDeserializer im Ordner Platforms\Windows Ihres .NET MAUI-App-Projekts hinzu.

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

Diese Windows-Version der Klasse PropertiesDeserializer erfordert die Erweiterungsmethode DontSync. Der folgende Code zeigt diese Erweiterungsmethode:

Hinweis

Um diesen Code zu verwenden, fügen Sie ihn zu einer Klasse namens Extensions im Ordner Platforms\Windows Ihres .NET MAUI-App-Projekts hinzu.

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

In diesem Beispiel wird die Klasse LegacyApplication verwendet, um einen Wert aus dem Eigenschaftswörterbuch der App zu lesen und dann den Wert in die .NET MAUI-Einstellungen zu schreiben.

Wichtig

Überprüfen Sie immer, ob der Schlüssel im Eigenschaftswörterbuch der App vorhanden ist, bevor Sie auf ihn zugreifen, um unerwartete Fehler zu vermeiden.