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.