Konteks Layanan Tersedia untuk Jenis Pengonversi dan Ekstensi Markup
Penulis jenis yang mendukung jenis pengonversi dan penggunaan ekstensi markup harus sering memiliki informasi kontekstual tentang di mana penggunaan terletak di markup, atau di struktur grafik objek di sekitarnya. Informasi mungkin diperlukan sehingga objek yang disediakan dibuat dengan benar atau sehingga referensi objek ke objek yang ada dalam grafik objek dapat dibuat. Saat menggunakan Layanan XAML .NET, konteks yang mungkin diperlukan diekspos sebagai serangkaian antarmuka layanan. Kode dukungan ekstensi pengonversi jenis atau markup dapat mengkueri layanan dengan menggunakan konteks penyedia layanan yang tersedia dan diteruskan dari XamlObjectWriter atau jenis terkait. Konteks skema XAML tersedia langsung melalui salah satu layanan tersebut. Topik ini menjelaskan cara mengakses konteks layanan dari implementasi pengonversi nilai, dan mencantumkan layanan yang biasanya tersedia dan perannya.
Mendapatkan Layanan
Sebagai pelaksana pengonversi nilai, Anda sering kali memerlukan akses ke beberapa jenis konteks di mana pengonversi nilai diterapkan. Konteks ini mungkin mencakup informasi seperti konteks skema XAML aktif, akses ke sistem pemetaan jenis yang disediakan konteks skema XAML dan penulis objek XAML, dan sebagainya. Layanan yang tersedia untuk ekstensi markup atau implementasi pengonversi jenis dikomunikasikan melalui parameter konteks yang merupakan bagian dari tanda tangan setiap metode virtual. Dalam setiap kasus, Anda telah IServiceProvider menerapkan dalam konteks, dan dapat memanggil IServiceProvider.GetService untuk meminta layanan.
Layanan untuk Ekstensi Markup
MarkupExtension hanya memiliki satu metode virtual, ProvideValue. Parameter input serviceProvider
adalah bagaimana layanan dikomunikasikan ke implementasi ketika ekstensi markup dipanggil oleh prosesor XAML. Pseudocode berikut menggambarkan bagaimana implementasi ekstensi markup mungkin meminta layanan dalam :ProvideValue
public override object ProvideValue(IServiceProvider serviceProvider)
{
//...
// Get the IXamlTypeResolver from the service provider
if (serviceProvider == null)
{
throw new ArgumentNullException("serviceProvider");
}
IXamlTypeResolver xamlTypeResolver = serviceProvider.GetService(typeof(IXamlTypeResolver)) as IXamlTypeResolver;
if (xamlTypeResolver == null)
{
throw new ArgumentException("IXamlTypeResolver");
}
//...
}
Layanan untuk Pengonversi Tipe
TypeConverter memiliki empat metode virtual yang menggunakan konteks layanan dan yang mendukung penggunaan XAML. Masing-masing metode ini melewati parameter input context
. Parameter ini berjenis ITypeDescriptorContextIServiceProvider, tetapi antarmuka tersebut mewarisi , dan oleh karena itu, ada metode yang GetService tersedia untuk mengetik implementasi pengonversi.
Pseudocode berikut mengilustrasikan bagaimana implementasi pengonversi jenis untuk penggunaan XAML mungkin meminta layanan di salah satu penimpaannya, dalam hal ConvertFromini :
public override object ConvertFrom(ITypeDescriptorContext typeDescriptorContext,
CultureInfo cultureInfo,
object source)
{
IRootObjectProvider rootProvider = typeDescriptorContext.GetService(typeof(IRootObjectProvider)) as IRootObjectProvider;
if (rootProvider != null && source is String)
{
//return something, else ...
}
throw GetConvertFromException(source);
}
Layanan untuk Serializer Nilai
Untuk konteks serializer nilai, Anda menggunakan jenis penyedia layanan yang khusus untuk ValueSerializer kelas , IValueSerializerContext. Konteks tersebut diteruskan untuk mengambil alih empat ValueSerializer metode virtual. Panggil GetService dari konteks untuk mendapatkan layanan.
Menggunakan Konteks Penyedia Layanan XAML
Penyedia layanan untuk GetService akses ke layanan XAML yang tersedia untuk ekstensi markup atau pengonversi jenis diimplementasikan sebagai kelas internal, dengan paparan hanya melalui antarmuka dan bagaimana itu diteruskan ke konteks yang relevan. Setiap kali operasi pemrosesan XAML dalam implementasi Layanan XAML .NET default dari jalur beban atau jalur penyimpanan memanggil ekstensi markup yang relevan atau metode pengonversi jenis yang memerlukan konteks layanan, objek internal ini diteruskan. Tergantung pada keadaannya, konteks layanan sistem menyediakan atau MarkupExtensionContext
TextSyntaxContext
, tetapi spesifikasi dari kedua kelas ini bersifat internal. Interaksi Anda dengan kelas-kelas ini terbatas pada permintaan layanan dari mereka, melalui GetService.
Layanan yang Tersedia dari Konteks Layanan .NET XAML
Layanan XAML .NET mendefinisikan layanan untuk ekstensi markup, pengonversi jenis, serializer nilai, dan kemungkinan penggunaan lainnya. Bagian berikut menjelaskan masing-masing layanan ini dan memberikan panduan tentang bagaimana layanan dapat digunakan dalam implementasi.
IServiceProvider
Dokumentasi referensi: IServiceProvider
Relevan dengan: Pengoperasian dasar infrastruktur berbasis layanan di .NET sehingga Anda dapat memanggil IServiceProvider.GetService.
ITypeDescriptorContext
Dokumentasi referensi: ITypeDescriptorContext
Berasal dari IServiceProvider. Kelas ini mewakili konteks dalam tanda tangan standar TypeConverter ; TypeConverter adalah kelas yang telah ada sejak .NET Framework 1.0. Ini mendahului XAML dan skenario XAML TypeConverter untuk konversi jenis nilai string. Dalam konteks Layanan XAML .NET, metode TypeConverter diimplementasikan secara eksplisit. Perilaku implementasi eksplisit menunjukkan kepada pemanggil bahwa ITypeDescriptorContext API tidak relevan untuk sistem jenis XAML, atau untuk membaca atau menulis objek dari XAML. Container, Instance, dan PropertyDescriptor umumnya kembali null
dari konteks Layanan XAML .NET.
IValueSerializerContext
Dokumentasi referensi: IValueSerializerContext
Berasal dari ITypeDescriptorContext dan juga bergantung pada implementasi eksplisit untuk menekan implikasi palsu tentang sistem jenis XAML. Mendukung metode pembantu pencarian statis pada ValueSerializer.
IXamlTypeResolver
Dokumentasi referensi: IXamlTypeResolver
Ditentukan oleh: System.Windows.Markup namespace, rakitan System.Xaml
Relevan dengan: Skenario jalur beban, dan interaksi dengan konteks skema XAML
API Layanan: Resolve
Dapat memengaruhi pemetaan jenis XAML-ke-CLR yang diperlukan ketika penulis XAML membuat objek CLR dalam grafik objek. Resolve memproses string yang berpotensi memenuhi syarat awalan yang sesuai dengan nama jenis XAML (XamlType.Name), dan mengembalikan CLR Type. Menyelesaikan jenis biasanya sangat bergantung pada konteks skema XAML. Hanya konteks skema XAML yang mengetahui pertimbangan seperti rakitan mana yang dimuat, dan rakitan mana yang dapat atau harus diakses untuk resolusi jenis.
IUriContext
Dokumentasi referensi: IUriContext
Ditentukan oleh: System.Windows.Markup namespace, rakitan System.Xaml
Relevan dengan: Muat jalur dan simpan penanganan jalur nilai anggota yang merupakan URI atau x:Uri
nilai.
API Layanan: BaseUri
Layanan ini melaporkan akar URI yang tersedia secara global, jika ada. Akar URI dapat digunakan untuk mengatasi URI relatif ke URI absolut atau sebaliknya. Skenario ini terutama relevan dengan layanan aplikasi yang diekspos oleh kerangka kerja tertentu, atau kemampuan kelas elemen akar yang sering digunakan dalam kerangka kerja. URI dasar dapat ditetapkan sebagai pengaturan pembaca XAML, yang kemudian diteruskan ke penulis objek XAML dan dilaporkan oleh layanan ini.
IAmbientProvider
Dokumentasi referensi: IAmbientProvider
Ditentukan oleh: System.Xaml namespace, rakitan System.Xaml
Relevan dengan: Memuat penanganan jalur dan mengetik penundaan pencarian atau pengoptimalan.
API Layanan: GetAllAmbientValues, tiga lainnya.
Konsep ambience dalam XAML adalah teknik untuk menandai anggota tertentu dari jenis sebagai sekitar. Atau, jenis dapat sekitar sehingga semua nilai properti yang menyimpan instans jenis harus dianggap sebagai properti sekitar. Ekstensi markup atau jenis pengonversi yang lebih jauh di sepanjang aliran simpul XAML dan yang merupakan turunan dalam grafik objek dapat mengakses properti sekitar atau mengetik instans pada waktu muat; atau mereka dapat menggunakan pengetahuan tentang struktur sekitar pada waktu hemat. Ini dapat memengaruhi tingkat kualifikasi yang diperlukan untuk menyelesaikan jenis untuk layanan lain, seperti untuk IXamlTypeResolver atau untuk x:Type
. Lihat juga AmbientPropertyValue.
IXamlSchemaContextProvider
Dokumentasi referensi: IXamlSchemaContextProvider
Ditentukan oleh: System.Xaml namespace, rakitan System.Xaml
Relevan dengan: Jalur beban, dan operasi apa pun yang harus menyelesaikan jenis XAML ke jenis backing.
API Layanan: SchemaContext
Konteks skema XAML diperlukan untuk setiap operasi beban yang ditangguhkan, karena konteks skema yang sama harus bertindak pada area yang ditangguhkan untuk mengintegrasikan konten yang ditangguhkan. Untuk informasi selengkapnya tentang peran konteks skema XAML, lihat Layanan XAML.
IRootObjectProvider
Dokumentasi referensi: IRootObjectProvider
Ditentukan oleh: System.Xaml namespace, rakitan System.Xaml
Relevan dengan: Muat jalur.
API Layanan: RootObject
Layanan ini relevan dengan layanan aplikasi yang diekspos oleh kerangka kerja tertentu atau dengan kemampuan kelas elemen akar yang sering digunakan dalam kerangka kerja. Salah satu skenario untuk mendapatkan objek akar adalah menghubungkan code-behind dan kabel peristiwa. Misalnya, implementasi x:Class
WPF digunakan untuk kompilasi markup dan kabel atribut penanganan aktivitas apa pun yang ditemukan pada posisi lain dalam markup XAML. Titik koneksi markup dan code-behind kelas parsial yang ditentukan untuk kompilasi markup ada di elemen root.
IXamlNamespaceResolver
Dokumentasi referensi: IXamlNamespaceResolver
Ditentukan oleh: System.Xaml namespace, rakitan System.Xaml
Relevan dengan: Muat jalur, simpan jalur.
API Layanan: GetNamespace untuk jalur beban, GetNamespacePrefixes untuk jalur penyimpanan.
IXamlNamespaceResolver adalah layanan yang dapat mengembalikan pengidentifikasi namespace XAML / URI berdasarkan awalannya seperti yang dipetakan dalam markup XAML asal.
IProvideValueTarget
Dokumentasi referensi: IProvideValueTarget
Ditentukan oleh: System.Windows.Markup namespace, rakitan System.Xaml
Relevan dengan: Memuat jalur dan menyimpan jalur.
API Layanan: TargetObject, TargetProperty.
IProvideValueTarget memungkinkan pengonversi jenis atau ekstensi markup untuk mendapatkan konteks tentang di mana ia bertindak pada waktu pemuatan. Implementasi mungkin menggunakan konteks ini untuk membatalkan penggunaan. Misalnya, WPF memiliki logika di dalam beberapa ekstensi markupnya seperti DynamicResourceExtension. Logika memeriksa TargetProperty untuk memastikan bahwa ekstensi hanya digunakan untuk mengatur properti dependensi (atau daftar singkat properti non-dependensi lainnya).
IXamlNameResolver
Dokumentasi referensi: IXamlNameResolver
Ditentukan oleh: System.Xaml namespace, rakitan System.Xaml
Relevan dengan: Memuat definisi grafik objek jalur, menyelesaikan objek yang diidentifikasi oleh x:Name
teknik , , x:Reference
atau khusus kerangka kerja.
API Layanan: Resolve; API lain untuk skenario yang lebih canggih seperti menangani referensi penerusan.
Implementasi x:Reference
penanganan Layanan XAML .NET bergantung pada layanan ini. Kerangka kerja atau alat tertentu yang mendukung kerangka kerja menggunakan layanan ini untuk x:Name
penanganan atau penanganan properti yang setara (RuntimeNamePropertyAttribute atribut).
IDestinationTypeProvider
Dokumentasi referensi: IDestinationTypeProvider
Ditentukan oleh: System.Xaml namespace, rakitan System.Xaml
Relevan dengan: Memuat resolusi jalur informasi jenis CLR tidak langsung.
API Layanan: GetDestinationType
Untuk informasi selengkapnya, lihat IDestinationTypeProvider .
Lihat juga
.NET Desktop feedback