Migrowanie danych ze słownika właściwości aplikacji platformy Xamarin.Forms do preferencji .NET MAUI
Zestaw narzędzi Xamarin.Forms zawiera Properties
słownik, którego można używać do przechowywania danych i do którego uzyskuje się dostęp przy użyciu Application.Current.Properties
właściwości . Ten słownik używa klucza string
i przechowuje wartość object
. Wartości w słowniku są zapisywane na urządzeniu po wstrzymaniu lub zamknięciu aplikacji i załadowaniu po ponownym uruchomieniu aplikacji lub powrocie z tła. Aby uzyskać więcej informacji na temat słownika właściwości, zobacz Słownik właściwości.
Podczas migrowania aplikacji platformy Xamarin.Forms, która przechowuje dane w słowniku właściwości aplikacji do programu .NET MAUI, należy przeprowadzić migrację tych danych do preferencji .NET MAUI. Można to osiągnąć za LegacyApplication
pomocą klasy i klas pomocnika, które przedstawiono w tym artykule. Ta klasa umożliwia aplikacji .NET MAUI w systemach Android, iOS i Windows odczytywanie danych ze słownika właściwości aplikacji utworzonego przy użyciu poprzedniej wersji platformy Xamarin.Forms aplikacji. Aby uzyskać więcej informacji na temat preferencji programu .NET MAUI, zobacz Preferencje.
Ważne
Nie ma interfejsu API, aby uzyskać dostęp do słownika właściwości aplikacji w programie .NET MAUI.
Uzyskiwanie dostępu do starszych danych właściwości aplikacji
Poniższy kod przedstawia klasę LegacyApplication
, która zapewnia dostęp do danych właściwości aplikacji utworzonych przez aplikację Xamarin.Forms:
Uwaga
Aby użyć tego kodu, dodaj go do klasy o nazwie LegacyApplication
w projekcie aplikacji .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
W systemie Android LegacyApplication
klasa używa PropertiesDeserializer
klasy do deserializacji danych z pliku słownika właściwości aplikacji. Poniższy kod przedstawia klasę PropertiesDeserializer
:
Uwaga
Aby użyć tego kodu, dodaj go do klasy o nazwie PropertiesDeserializer
w folderze Platforms\Android projektu aplikacji .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
W systemie iOS LegacyApplication
klasa używa PropertiesDeserializer
klasy do deserializacji danych z pliku słownika właściwości aplikacji. Poniższy kod przedstawia klasę PropertiesDeserializer
:
Uwaga
Aby użyć tego kodu, dodaj go do klasy o nazwie PropertiesDeserializer
w folderze Platforms\iOS projektu aplikacji .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
W systemie Windows LegacyApplication
klasa używa PropertiesDeserializer
klasy do deserializacji danych z pliku słownika właściwości aplikacji. Poniższy kod przedstawia klasę PropertiesDeserializer
:
Uwaga
Aby użyć tego kodu, dodaj go do klasy o nazwie PropertiesDeserializer
w folderze Platformy\Windows projektu aplikacji .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);
}
}
}
Ta wersja PropertiesDeserializer
systemu Windows klasy wymaga DontSync
metody rozszerzenia. Poniższy kod przedstawia tę metodę rozszerzenia:
Uwaga
Aby użyć tego kodu, dodaj go do klasy o nazwie Extensions
w folderze Platformy\Windows projektu aplikacji .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);
}
}
Korzystanie ze starszych danych właściwości aplikacji
Klasa LegacyApplication
może służyć do korzystania z danych ze słownika właściwości aplikacji w systemach Android, iOS i Windows utworzonych przy użyciu poprzedniej wersji platformy Xamarin.Forms aplikacji:
#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
W tym przykładzie LegacyApplication
pokazano użycie klasy do odczytania wartości ze słownika właściwości aplikacji, a następnie zapisanie wartości w preferencjach programu .NET MAUI.
Ważne
Przed uzyskaniem dostępu do niego zawsze sprawdź obecność klucza w słowniku właściwości aplikacji, aby zapobiec nieoczekiwanym błędom.