XAML 的類型轉換子和標記延伸
類型轉換器和標記延伸是 XAML 類型系統和 XAML 寫入器用以產生物件圖形元件的兩項技術。 雖然兩者共用某些特性,但類型轉換器和標記延伸在 XAML 節點資料流中會以不同的方式表示。 在本文件集中,有時會將類型轉換器、標記延伸和類似的建構統稱為值轉換器。
值轉換器
在 XAML 中,值轉換器可用於多種情節。 下列清單顯示 XAML 中不同類型的值轉換器:
類型轉換器
標記延伸
值序列化程式
為 XAML 文字語法提供邏輯的相關類別或支援類別
類型轉換器
在 .NET XAML 服務定義中,類型轉換器是衍生自 CLR TypeConverter 類別的類別。 TypeConverter 是 XAML 存在之前在 .NET 中的類別。 其原始目的是支援 IDE 屬性的屬性視窗和類似的文字型編輯隱喻。 .NET 的 XAML 簡介會使用 TypeConverter 將文字語法(如屬性值或 XAML 值節點中所找到)轉換成 物件。 TypeConverter 也可用來將物件值序列化為文字語法。 TypeConverter 也用於 Windows Presentation Foundation (WPF) 和 Windows Communication Foundation (WCF) 中先前架構特定的 XAML 實作中。 如需在 XAML 中 TypeConverter 的詳細資訊,請參閱 Type Converters for XAML Overview。
標記延伸
在 .NET XAML 服務實作中,標記延伸是衍生自 類別的 MarkupExtension 類別。 標記延伸是一種概念,在這種形式下的標記都是源自 XAML 語言。 您可以將標記延伸視為類似可延伸的逸出序列,這個序列會呼叫服務類別來提供其邏輯。 就標記而言,XAML 處理器普遍會將文字字串中以左大括號 ({) 開頭的文字序列視為標記延伸。
標記延伸與類型轉換器不同。 類型轉換器通常與類型或成員相關聯。 當物件圖形建立或序列化作業遇到與這些實體關聯的文字語法時,即會叫用類型轉換器。
標記延伸與單一支援服務類別相關聯,但可套用至任何成員值。 不過,您可以使用服務內容,實作標記延伸,以刻意限制其使用特定成員或目的地類型。標記延伸可以覆寫類型轉換器關聯。 或者,您可以使用標記延伸,為原本不支援文字語法的成員指定屬性值。
如需 XAML 之標記延伸實作模式的詳細資訊,請參閱 Markup Extensions for XAML Overview。
值序列化程式
ValueSerializer 是為了以最佳方式將物件轉換成字串而特製化的類型轉換器。 XAML 的 ValueSerializer 可能完全無法實作 ConvertFrom
方法。 ValueSerializer 實作取得服務的方式與 TypeConverter 實作類似。 虛擬方法會提供輸入 context
參數。 context
參數屬於 IValueSerializerContext類型,該類型繼承自 IServiceProvider 介面並具有 GetService 方法。
在 XAML 類型系統中,以及針對使用 XAML 節點迴圈處理序列化的 XAML 寫入器實作,與類型或成員關聯的值轉換器會由其專屬的 XamlType.ValueSerializer 屬性來報告。 這對執行序列化的 XAML 寫入器所代表的意義是,如果有 XamlType.TypeConverter 和 XamlType.ValueSerializer ,則應針對載入路徑使用類型轉換器,並應針對儲存路徑使用值序列化程式。 如果有 XamlType.TypeConverter 但 XamlType.ValueSerializer 為 null
,也應針對儲存路徑使用類型轉換器。
其他值轉換器
值轉換器可延伸至超出類型轉換器或標記延伸的特定模式。 不過,此自訂也需要重新定義 .NET XAML 服務所提供的 XAML 類型系統。 現有 XAML 類型系統具有適用於類型轉換子、標記延伸和值序列化程式的表示和報告系統,但沒有適用於自訂形式之值轉換的表示和報告系統。 如果您想要建立自訂值轉換器,請使用 XamlValueConverter<TConverterBase> 類型。
類型轉換器和標記延伸的組合
標記延伸和類型轉換器會用於 XAML 中的不同情況。 儘管有適合標記延伸使用的內容,但標記延伸負責提供值的屬性類型轉換行為在標記延伸實作中通常不會遭到檢查。 換句話說,即使標記延伸傳回文字字串做為其 ProvideValue
輸出,也不會在該字串上,叫用套用至特定屬性或屬性值類型的類型轉換行為。 一般來說,標記延伸的目的是在未涉及任何類型轉換器的情況下,處理字串及傳回物件。
值轉換器的服務內容
當您實作值轉換器時,您通常會需要存取套用值轉換器的內容。 這個內容稱為服務內容。 服務內容可能包含作用中 XAML 架構內容、存取 XAML 架構內容和 XAML 物件寫入器所提供的類型對應系統等資訊。 如需值轉換器的可用服務內容,以及如何存取服務內容可能提供之服務的詳細資訊,請參閱 Service Contexts Available to Type Converters and Markup Extensions。