Bagikan melalui


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:Nameteknik , , x:Referenceatau 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