共用方式為


架構屬性中繼資料 (WPF .NET)

您可以在 Windows Presentation Foundation (WPF) 架構層級設定相依性屬性的架構屬性中繼資料選項。 WPF 架構層級的指定適用於 WPF 呈現 API 和可執行檔處理轉譯與資料繫結的情況。 呈現 API 和可執行檔可查詢相依性屬性的 FrameworkPropertyMetadata

必要條件

本文假設您具備相依性屬性的基本知識,而且已閱讀相依性屬性概觀。 若要遵循本文中的範例,建議您先熟悉 Extensible Application Markup Language (XAML),並了解如何撰寫 WPF 應用程式。

架構屬性中繼資料類別

FrameworkPropertyMetadata 屬於下列類別:

  • 影響元素配置的中繼資料,特別是 AffectsArrangeAffectsMeasureAffectsRender 中繼資料旗標。 如果您的相依性屬性實作會影響視覺層面,而且您正在您的類別中實作 MeasureOverrideArrangeOverride,則可以設定這些旗標。 MeasureOverrideArrangeOverride 方法可向配置系統提供實作特定的行為和轉譯資訊。 當相依性屬性的中繼資料中的 AffectsArrangeAffectsMeasureAffectsRender 設定為 true 且其有效值發生變更時,WPF 屬性系統將起始要求以使元素的視覺效果無效以觸發重繪。

  • 影響元素的父元素配置的中繼資料,特別是 AffectsParentArrangeAffectsParentMeasure 中繼資料旗標。 設定這些旗標的 WPF 相依性屬性的範例為 FixedPage.LeftParagraph.KeepWithNext

  • 屬性值繼承中繼資料,特別是 InheritsOverridesInheritanceBehavior 中繼資料旗標。 根據預設,相依性屬性不繼承值。 OverridesInheritanceBehavior 讓繼承路徑也可以在視覺化樹狀結構中移動,它對某些控制項複合案例是必要的。 如需詳細資訊,請參閱屬性值繼承

    注意

    在屬性值的內容中,"inherits" (「繼承」) 一詞特指相依性屬性,並不直接與受控程式碼類型和透過衍生類型進行的成員繼承相關。 在相依性屬性的內容中,這意味著子元素可以從父元素繼承相依性屬性值。

  • 資料繫結中繼資料,特別是 BindsTwoWayByDefaultIsNotDataBindable 中繼資料旗標。 根據預設,WPF 架構中的相依性屬性支援單向繫結。 考慮將雙向繫結設為報告狀態可由使用者動作修改的屬性的預設值,例如 IsSelected。 此外,當控制項的使用者期望屬性實作雙向繫結時,也應考慮將雙向繫結設為預設值,例如 TextBox.TextBindsTwoWayByDefault 只會影響預設的繫結模式。 若要編輯繫結的資料流程方向,請設定 Binding.Mode。 若沒有使用資料繫結的需求情況時,您可以使用 IsNotDataBindable 來停用資料繫結。 如需資料繫結的詳細資訊,請參閱資料繫結概觀

  • 日誌記錄中繼資料,特別是 Journal 中繼資料旗標。 對於某些相依性屬性 (例如 SelectedIndex),Journal 旗標的預設值僅為 true。 使用者輸入控制項應為其值保存需要儲存的使用者所選擇的屬性設定 Journal 旗標。 Journal 旗標由支援日誌記錄的應用程式或服務 (包括 WPF 日誌記錄服務) 讀取。 如需儲存瀏覽步驟的詳細資訊,請參閱瀏覽概觀

FrameworkPropertyMetadata 直接衍生自 UIPropertyMetadata,並實作此處討論的旗標。 除非專門設定,否則 FrameworkPropertyMetadata 旗標的預設值為 false

讀取 FrameworkPropertyMetadata

若要擷取相依性屬性的中繼資料,請對 DependencyProperty 識別碼呼叫 GetMetadataGetMetadata 呼叫會傳回一個 PropertyMetadata 物件。 如果您需要查詢架構中繼資料值,請將 PropertyMetadata 轉換為 FrameworkPropertyMetadata

指定 FrameworkPropertyMetadata

當您註冊相依性屬性時,您可以選擇為它建立中繼資料並將該中繼資料指派給它。 您指派的中繼資料物件可以是 PropertyMetadata 或其衍生類別之一,例如 FrameworkPropertyMetadata。 對於依賴 WPF 呈現 API 和可執行檔進行轉譯和資料繫結的相依性屬性,請選擇 FrameworkPropertyMetadata。 更進階的選項是從 FrameworkPropertyMetadata 衍生以建立具有更多旗標的自訂中繼資料報告類別。 或者,您也可以將 UIPropertyMetadata 用於會影響 UI 轉譯的非架構屬性。

儘管中繼資料選項通常是在註冊新相依性屬性期間設定的,但您可以在 OverrideMetadataAddOwner 呼叫中重新指定它們。 覆寫中繼資料時,請一律使用屬性註冊期間所使用的相同中繼資料類型進行覆寫。

FrameworkPropertyMetadata 所公開的屬性特性有時稱為旗標。 如果您要建立 FrameworkPropertyMetadata 實例,有兩種方式可以填入旗標值:

  1. FrameworkPropertyMetadataOptions 列舉類型的實例上設定旗標。 FrameworkPropertyMetadataOptions 可讓您以位元或組合的方式指定中繼資料旗標。 然後,使用具有 FrameworkPropertyMetadataOptions 參數的建構函式具現化 FrameworkPropertyMetadata,並傳入您的 FrameworkPropertyMetadataOptions 實例。 若要在將 FrameworkPropertyMetadataOptions 傳遞到 FrameworkPropertyMetadata 建構函式後變更中繼資料旗標,請變更新的 FrameworkPropertyMetadata 實例上的對應屬性。 例如,如果您設定了 FrameworkPropertyMetadataOptions.NotDataBindable 旗標,則可以透過將 FrameworkPropertyMetadata.IsNotDataBindable 設為 false 來撤銷該設定。

  2. 使用不含 FrameworkPropertyMetadataOptions 參數的建構函式來具現化 FrameworkPropertyMetadata,然後在 FrameworkPropertyMetadata 上設定適用的 Boolean 旗標。 在將您的 FrameworkPropertyMetadata 實例與相依性屬性產生關聯之前設定旗標值,否則您將取得 InvalidOperationException

中繼資料覆寫行為

當您覆寫架構屬性中繼資料時,已變更的中繼資料值會取代原始值或與原始值合併:

  • 對於 PropertyChangedCallback,預設的合併邏輯會保留資料表中先前的 PropertyChangedCallback 值,而且所有值都會在屬性變更時叫用。 回呼順序由類別深度決定,其中階層中的基底類別所註冊的回呼會先執行。 繼承的回呼只會執行一次,而且由將它們新增到中繼資料中的類別所擁有。

  • 對於 DefaultValue,新值將取代現有的預設值。 如果您未在覆寫中繼資料中指定 DefaultValue 且現有的 FrameworkPropertyMetadata 設定了 Inherits 旗標,則預設值會來自在中繼資料中指定了 DefaultValue 的最近的上階項目。

  • 對於 CoerceValueCallback,新值將取代現有的 CoerceValueCallback 值。 如果您未在覆寫中繼資料中指定 CoerceValueCallback,則該值會來自繼承鏈結中指定了 CoerceValueCallback 的最近的上階項目。

  • 對於 FrameworkPropertyMetadata 非繼承的旗標,您可以使用 true 值來覆寫預設的 false 值。 不過,對於 InheritsJournalOverridesInheritanceBehaviorSubPropertiesDoNotAffectRender,您只能使用 false 值來覆寫 true 值。

注意

預設的合併邏輯由 Merge 方法實作。 您可以在繼承相依性屬性的衍生類別中指定自訂合併邏輯,方法是覆寫該類別中的 Merge

另請參閱