Sdílet prostřednictvím


Migrace dat ze slovníku vlastností aplikace Xamarin.Forms do předvoleb .NET MAUI

Xamarin.Forms má Properties slovník, který lze použít k ukládání dat a ke kterému se přistupuje pomocí Application.Current.Properties vlastnosti. Tento slovník využívá klíč string a ukládá hodnotu object. Hodnoty ve slovníku se uloží do zařízení, když je aplikace pozastavená nebo vypnutá, a načtou se při restartování nebo vrácení aplikace z pozadí. Další informace o slovníku vlastností naleznete v tématu Slovník vlastností.

Při migraci aplikace Xamarin.Forms, která ukládá data ve slovníku vlastností aplikace do .NET MAUI, byste tato data měli migrovat do předvoleb .NET MAUI. Toho lze dosáhnout pomocí LegacyApplication třídy a pomocných tříd, které jsou uvedeny v tomto článku. Tato třída umožňuje aplikaci .NET MAUI v systému Android, iOS a Windows číst data ze slovníku vlastností aplikace, který byl vytvořen s předchozí verzí aplikace Xamarin.Forms. Další informace o předvolbách .NET MAUI najdete v tématu Předvolby.

Důležité

Pro přístup ke slovníku vlastností aplikace v .NET MAUI neexistuje žádné rozhraní API.

Přístup ke starším datům vlastností aplikace

Následující kód ukazuje LegacyApplication třídu, která poskytuje přístup k datům vlastností aplikace vytvořená vaší aplikací Xamarin.Forms:

Poznámka:

Pokud chcete tento kód použít, přidejte ho do třídy pojmenované LegacyApplication v projektu aplikace .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

V Androidu třída LegacyApplication používá PropertiesDeserializer třídu k deserializaci dat ze souboru slovníku vlastností aplikace. Následující kód ukazuje PropertiesDeserializer třídu:

Poznámka:

Pokud chcete tento kód použít, přidejte ho do třídy pojmenované PropertiesDeserializer ve složce Platforms\Android projektu aplikace .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

V iOSu třída LegacyApplication používá PropertiesDeserializer třídu k deserializaci dat ze souboru slovníku vlastností aplikace. Následující kód ukazuje PropertiesDeserializer třídu:

Poznámka:

Pokud chcete tento kód použít, přidejte ho do třídy pojmenované PropertiesDeserializer ve složce Platforms\iOS projektu aplikace .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

Ve Windows třída LegacyApplication používá PropertiesDeserializer třídu k deserializaci dat ze souboru slovníku vlastností aplikace. Následující kód ukazuje PropertiesDeserializer třídu:

Poznámka:

Pokud chcete tento kód použít, přidejte ho do třídy pojmenované PropertiesDeserializer ve složce Platforms\Windows projektu aplikace .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);
        }
    }
}

Tato verze třídy systému PropertiesDeserializer Windows vyžaduje metodu DontSync rozšíření. Následující kód ukazuje tuto metodu rozšíření:

Poznámka:

Pokud chcete tento kód použít, přidejte ho do třídy pojmenované Extensions ve složce Platforms\Windows projektu aplikace .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);
    }
}

Využívání starších dat vlastností aplikace

Třídu LegacyApplication můžete použít ke zpracování dat ze slovníku vlastností aplikace, v Androidu, iOSu a Windows vytvořeném s předchozí verzí Xamarin.Forms vaší aplikace:

#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

Tento příklad ukazuje použití LegacyApplication třídy ke čtení hodnoty ze slovníku vlastností aplikace a zápis hodnoty do předvoleb .NET MAUI.

Důležité

Před přístupem ke slovníku vlastností aplikace vždy zkontrolujte přítomnost klíče, abyste zabránili neočekávaným chybám.