共用方式為


XAML 的型別轉換子和標記延伸

型別轉換子和標記延伸是 XAML 型別系統和 XAML 寫入器用以產生物件圖形元件的兩項技術。 雖然兩者共用某些特性,但型別轉換子與標記延伸在 XAML 節點資料流中會以不同的方式表示。 在本文件集中,有時會將型別轉換子、標記延伸和類似的建構統稱為值轉換子。

這個主題包含下列章節。

  • 值轉換子
  • 型別轉換子
  • 標記延伸
  • 值序列化程式
  • 其他值轉換子
  • 型別轉換子與標記延伸的組合
  • 值轉換子的服務內容
  • 相關主題

值轉換子

在 XAML 中,值轉換子可運用於多種情節。 下列清單顯示 XAML 中不同型別的值轉換子:

  • 型別轉換子

  • 標記延伸

  • 值序列化程式

  • 為 XAML 文字語法提供邏輯的相關類別或支援類別

型別轉換子

在 .NET Framework XAML 服務定義中,型別轉換子是衍生自 CLR TypeConverter 類別的類別。 TypeConverter 類別比 XAML 還早出現在 Microsoft .NET Framework 中。 其原始用途是要支援 IDE 屬性的屬性視窗和類似文字編輯環境。 將 XAML 加入到 .NET Framework 時使用了 TypeConverter,以將文字語法 (如屬性值或 XAML 值節點中的文字語法) 轉換成物件。TypeConverter 也可用來將物件值序列化成文字語法。 在先前 Windows Presentation Foundation (WPF) 和 Windows Communication Foundation (WCF) 的架構特定 XAML 實作中,也使用了 TypeConverter。如需 XAML 中之 TypeConverter 的詳細資訊,請參閱 XAML 型別轉換子概觀

標記延伸

在 .NET Framework XAML 服務實作中,標記延伸是衍生自 MarkupExtension 類別的類別。 標記延伸是依此模式源自 XAML 語言的概念。 您可以將標記延伸視為可延伸的逸出序列,這個序列要呼叫服務類別來提供邏輯。 就標記而言,XAML 處理器普遍會將文字字串中以左大括號 ({) 開頭的文字序列視為標記延伸。

標記延伸與型別轉換子不同。 型別轉換子通常與型別或成員相關聯。 每當建立或序列化物件圖形時,只要遇到與那些實體相關聯的文字語法,即會叫用型別轉換子。

標記延伸與單一支援服務類別相關聯,但可套用於任何成員值 (不過,您可以使用服務內容實作標記延伸,以刻意將標記延伸用法限定於特定的成員或目的型別)。標記延伸可覆寫型別轉換子關聯。 或者,您可以使用標記延伸,為原本不支援文字語法的成員指定屬性值。

若想進一步了解 XAML 的標記延伸實作模式,請參閱 XAML 標記延伸概觀

注意事項注意事項

MarkupExtensionValueSerializer 型別皆位於 System.Windows.Markup 命名空間中,而非位於 System.Xaml 命名空間中。這並不表示這些型別專屬於會在其他情況下填入包含字串 Windows 之 CLR 命名空間的 WPF 或 Windows Forms 技術。MarkupExtensionValueSerializer 位於 System.Xaml 組件中,而且並不依賴特定架構。這些型別在 .NET Framework 3.0 存在於 CLR 命名空間中,到了 .NET Framework 4 仍存在於 CLR 命名空間中,這是為了避免破壞現有 WPF 專案中的參考。如需詳細資訊,請參閱 從 WPF 移轉至 System.Xaml 的型別

值序列化程式

ValueSerializer 是為了以最佳方式將物件轉換成字串而特製化的型別轉換子。 XAML 的 ValueSerializer 可能完全無法實作 ConvertFrom 方法。 ValueSerializer 實作會用和 TypeConverter 實作類似的方式取得服務。 虛擬方法會提供輸入 context 參數。 context 參數屬於型別 IValueSerializerContext,而此型別繼承自 IServiceProvider 介面,並且具有 GetService 方法。

在 XAML 型別系統中,以及使用迴圈處理 XAML 節點序列化的 XAML 寫入器實作中,與型別或成員相關聯的值轉換子會由其專屬的 XamlType.ValueSerializer 屬性來報告。 對於執行序列化的 XAML 寫入器而言,其意義是如果有 XamlType.TypeConverterXamlType.ValueSerializer 存在,則應將型別轉換子用於載入路徑,並將值轉換子用於儲存路徑。 如果有 XamlType.TypeConverter 存在,但 XamlType.ValueSerializer 為 null,則型別轉換子也會用於儲存路徑。

其他值轉換子

值轉換子可延伸至超出型別轉換子或標記延伸的特定模式。 但若要進行此自訂,還必須重新定義 .NET Framework XAML 服務所提供的 XAML 型別系統。 現有 XAML 型別系統具有型別轉換子、標記延伸和值序列化程式適用的表示和報告系統,但沒有適用於自訂形式之值轉換的表示和報告系統。 如果想要建立自訂值轉換子,請使用 XamlValueConverter<TConverterBase> 型別。

型別轉換子與標記延伸的組合

標記延伸與型別轉換子分別適用於 XAML 中的不同情況。 儘管有適合標記延伸使用的內容,但標記延伸負責提供值的屬性型別轉換行為在標記延伸實作中通常不會遭到檢查。 換句話說,即使標記延伸傳回文字字串形式的 ProvideValue 輸出,此作業和該字串上的型別轉換行為 (如同套用至特定屬性或屬性值型別的型別轉換行為) 並不相關。 一般來說,標記延伸的目的是在未涉及任何型別轉換子的情況下處理字串及傳回物件。

值轉換子的服務內容

當您實作值轉換子時,您常會需要存取套用了值轉換子的內容。 此內容稱為服務內容。 服務內容包含的資訊可包括作用中的 XAML 結構描述內容,以及對 XAML 結構描述內容和 XAML 物件寫入器都會提供之型別對應系統的存取等等。 若想進一步了解值轉換子的可用服務內容,以及如何存取服務內容可能提供的服務,請參閱適用於型別轉換子和標記延伸的服務內容

請參閱

參考

MarkupExtension

XamlObjectWriter

其他資源

XAML 標記延伸概觀

XAML 型別轉換子概觀

適用於型別轉換子和標記延伸的服務內容