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.