Xamarin.Forms uygulama özellikleri sözlüğündeki verileri .NET MAUI tercihlerine geçirme
Xamarin.Forms, verileri depolamak için kullanılabilecek ve özelliği kullanılarak Application.Current.Properties
erişilen bir Properties
sözlüğe sahiptir. Bu sözlük bir string
anahtarı kullanarak bir object
değeri depolar. Sözlükteki değerler, uygulama duraklatıldığında veya kapatıldığında cihaza kaydedilir ve bir uygulama yeniden başlatıldığında veya arka planda döndürdüğünde yüklenir. Özellikler sözlüğü hakkında daha fazla bilgi için bkz . Özellikler sözlüğü.
Uygulama özellikleri sözlüğündeki verileri depolayan bir Xamarin.Forms uygulamasını .NET MAUI'ye geçirirken, bu verileri .NET MAUI tercihlerine geçirmeniz gerekir. Bu, bu makalede sunulan sınıfı ve yardımcı sınıfları ile LegacyApplication
gerçekleştirilebilir. Bu sınıf, Android, iOS ve Windows'ta .NET MAUI uygulamanızın uygulamanızın önceki bir Xamarin.Forms sürümüyle oluşturulan uygulama özellikleri sözlüğündeki verileri okumasını sağlar. .NET MAUI tercihleri hakkında daha fazla bilgi için bkz . Tercihler.
Önemli
.NET MAUI'de uygulama özellikleri sözlüğüne erişecek API yoktur.
Eski uygulama özellikleri verilerine erişme
Aşağıdaki kod, Xamarin.Forms uygulamanız tarafından oluşturulan uygulama özellikleri verilerine erişim sağlayan sınıfını gösterir LegacyApplication
:
Not
Bu kodu kullanmak için .NET MAUI uygulama projenizde adlı LegacyApplication
bir sınıfa ekleyin.
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
Android'de LegacyApplication
sınıfı, uygulama özellikleri sözlük dosyasındaki PropertiesDeserializer
verileri seri durumdan çıkarmak için sınıfını kullanır. Aşağıdaki kod sınıfını PropertiesDeserializer
gösterir:
Not
Bu kodu kullanmak için.NET MAUI uygulama projenizin Platforms\Android klasöründe adlı PropertiesDeserializer
bir sınıfa ekleyin.
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
iOS'ta LegacyApplication
sınıfı, uygulama özellikleri sözlük dosyasındaki verileri seri durumdan çıkarmak için sınıfını kullanır PropertiesDeserializer
. Aşağıdaki kod sınıfını PropertiesDeserializer
gösterir:
Not
Bu kodu kullanmak için,.NET MAUI uygulama projenizin Platforms\iOS klasöründe adlı PropertiesDeserializer
bir sınıfa ekleyin.
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
Windows'da sınıfı, LegacyApplication
uygulama özellikleri sözlük dosyasındaki verileri seri durumdan çıkarmak için sınıfını kullanır PropertiesDeserializer
. Aşağıdaki kod sınıfını PropertiesDeserializer
gösterir:
Not
Bu kodu kullanmak için,.NET MAUI uygulama projenizin Platforms\Windows klasöründe adlı PropertiesDeserializer
bir sınıfa ekleyin.
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);
}
}
}
Sınıfının bu Windows sürümü PropertiesDeserializer
için uzantı yöntemi gerekir DontSync
. Aşağıdaki kod bu uzantı yöntemini gösterir:
Not
Bu kodu kullanmak için,.NET MAUI uygulama projenizin Platforms\Windows klasöründe adlı Extensions
bir sınıfa ekleyin.
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);
}
}
Eski uygulama özellik verilerini kullanma
LegacyApplication
sınıfı, uygulamanızın önceki bir Xamarin.Forms sürümüyle oluşturulan Android, iOS ve Windows'da uygulama özellikleri sözlüğündeki verileri kullanmak için kullanılabilir:
#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
Bu örnekte, uygulama özellikleri sözlüğünden bir değeri okumak ve ardından değeri .NET MAUI tercihlerine yazmak için sınıfın kullanılması LegacyApplication
gösterilmektedir.
Önemli
Beklenmeyen hataları önlemek için, anahtarın uygulama özellikleri sözlüğüne erişmeden önce her zaman mevcut olup olmadığını denetleyin.