Memigrasikan data dari kamus properti aplikasi Xamarin.Forms ke preferensi MAUI .NET
Xamarin.Forms memiliki Properties
kamus yang dapat digunakan untuk menyimpan data, dan yang diakses menggunakan Application.Current.Properties
properti . Kamus string
ini menggunakan kunci dan menyimpan object
nilai. Nilai dalam kamus disimpan ke perangkat saat aplikasi dijeda atau dimatikan, dan dimuat saat aplikasi dimulai ulang atau dikembalikan dari latar belakang. Untuk informasi selengkapnya tentang kamus properti, lihat Kamus properti.
Saat memigrasikan aplikasi Xamarin.Forms yang menyimpan data dalam kamus properti aplikasi ke .NET MAUI, Anda harus memigrasikan data ini ke preferensi MAUI .NET. Ini dapat dicapai dengan LegacyApplication
kelas, dan kelas pembantu, yang disajikan dalam artikel ini. Kelas ini memungkinkan aplikasi .NET MAUI Anda di Android, iOS, dan Windows, untuk membaca data dari kamus properti aplikasi yang dibuat dengan versi Xamarin.Forms sebelumnya dari aplikasi Anda. Untuk informasi selengkapnya tentang preferensi MAUI .NET, lihat Preferensi.
Penting
Tidak ada API untuk mengakses kamus properti aplikasi di .NET MAUI.
Mengakses data properti aplikasi warisan
Kode berikut menunjukkan LegacyApplication
kelas , yang menyediakan akses ke data properti aplikasi yang dibuat oleh aplikasi Xamarin.Forms Anda:
Catatan
Untuk menggunakan kode ini, tambahkan ke kelas bernama LegacyApplication
di proyek aplikasi .NET MAUI Anda.
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
Di Android, LegacyApplication
kelas menggunakan PropertiesDeserializer
kelas untuk mendeserialisasi data dari file kamus properti aplikasi. Kode berikut menunjukkan PropertiesDeserializer
kelas:
Catatan
Untuk menggunakan kode ini, tambahkan ke kelas bernama PropertiesDeserializer
di folder Platforms\Android dari proyek aplikasi .NET MAUI Anda.
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
Di iOS, LegacyApplication
kelas menggunakan PropertiesDeserializer
kelas untuk mendeserialisasi data dari file kamus properti aplikasi. Kode berikut menunjukkan PropertiesDeserializer
kelas:
Catatan
Untuk menggunakan kode ini, tambahkan ke kelas bernama PropertiesDeserializer
di folder Platforms\iOS dari proyek aplikasi .NET MAUI Anda.
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
Di Windows, LegacyApplication
kelas menggunakan PropertiesDeserializer
kelas untuk mendeserialisasi data dari file kamus properti aplikasi. Kode berikut menunjukkan PropertiesDeserializer
kelas:
Catatan
Untuk menggunakan kode ini, tambahkan ke kelas bernama PropertiesDeserializer
di folder Platforms\Windows dari proyek aplikasi .NET MAUI Anda.
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);
}
}
}
Versi Windows kelas PropertiesDeserializer
ini memerlukan DontSync
metode ekstensi. Kode berikut menunjukkan metode ekstensi ini:
Catatan
Untuk menggunakan kode ini, tambahkan ke kelas bernama Extensions
di folder Platforms\Windows dari proyek aplikasi .NET MAUI Anda.
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);
}
}
Mengonsumsi data properti aplikasi warisan
Kelas LegacyApplication
ini dapat digunakan untuk menggunakan data dari kamus properti aplikasi, di Android, iOS, dan Windows, yang dibuat dengan versi Xamarin.Forms sebelumnya dari aplikasi Anda:
#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
Contoh ini menunjukkan penggunaan LegacyApplication
kelas untuk membaca nilai dari kamus properti aplikasi, lalu menulis nilai ke preferensi MAUI .NET.
Penting
Selalu periksa keberadaan kunci dalam kamus properti aplikasi sebelum mengaksesnya, untuk mencegah kesalahan yang tidak terduga.
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk