架構屬性中繼資料
針對在 Windows Presentation Foundation (WPF) 架構中視為 WPF 架構層級的物件項目屬性,報告架構屬性中繼資料選項。 WPF 架構層級指定一般會需要由 WPF 簡報 API 和可執行檔處理的轉譯、資料繫結和屬性系統調整等功能。 這些系統會查詢架構屬性中繼資料,以判斷特定項目屬性的特定功能特性。
必要條件
本主題假設您已從 Windows Presentation Foundation (WPF) 類別的現有相依性屬性消費者角度了解相依性屬性,並已閱讀相依性屬性概觀主題。 您也應該已閱讀相依性屬性中繼資料。
架構屬性中繼資料通訊的內容
架構屬性中繼資料可分成下列分類︰
報告會影響元素的版面配置屬性 (AffectsArrange、AffectsMeasure、AffectsRender)。 如果屬性會影響這些個別層面,您可在中繼資料中設定這些旗標,也要在您的類別中實作 MeasureOverride / ArrangeOverride 方法,提供特定的轉譯行為和版面配置系統資訊。 一般而言,這類實作會檢查相依性屬性是否屬性失效,這些相依性屬性在屬性中繼資料中的任何配置屬性都是 true,而且只有這些失效需要要求新的配置傳遞。
報告會影響專案父元素的版面配置屬性 (AffectsParentArrange、AffectsParentMeasure)。 預設會設定旗標的範例是 FixedPage.Left 和 Paragraph.KeepWithNext。
Inherits. 相依性屬性預設不繼承值。 OverridesInheritanceBehavior 讓繼承路徑也可以在視覺化樹狀結構中移動,它對某些控制項複合案例是必要的。
注意
屬性值內容中的「繼承」一詞表示相依性屬性的特定項目,它表示因為 WPF 屬性系統的 WPF 架構層級功能,子項目可以繼承父項目的實際相依性屬性值。 它和 Managed 程式碼類型及透過衍生類型的成員繼承沒有直接關係。 如需詳細資訊,請參閱屬性值繼承。
報告資料繫結的特性 (IsNotDataBindable、BindsTwoWayByDefault)。 根據預設,架構中的相依性屬性以單向繫結行為支援資料繫結。 如果沒有任何案例,您可能會停用資料繫結 (因為它們具有彈性且可延伸,所以預設的 WPF API 中沒有太多這類屬性的範例)。 您可能會為屬性設定雙向預設值的繫結,此屬性會將元件組件間的控制項行為繫結在一起 (例如 IsSubmenuOpen),或其雙向繫結對使用者而言是一般且預期的案例 (例如 Text)。 對預設值一律可以變更的每個繫結而言,變更與資料繫結相關的中繼資料只會影響預設值。 如需繫結模式和一般繫結的詳細資訊,請參閱資料繫結概觀。
報告屬性應該由支援日誌功能的應用程式或服務記錄日誌 (Journal)。 一般項目預設不啟用日誌功能,但某些使用者輸入控制項會選擇性地啟用。 此屬性原由日誌服務讀取,包括 WPF 實作日誌功能,通常設定在使用者控制項,例如在所有瀏覽步驟都應保存之清單的使用者選取範圍。 如需日誌的相關資訊,請參閱巡覽概觀。
讀取 FrameworkPropertyMetadata
上述連結的每個屬性都是 FrameworkPropertyMetadata 新增至其實即時基底類別 UIPropertyMetadata 的特定屬性。 這些屬性每一個預設都是 false
。 知道這些屬性值很重要的屬性中繼資料要求,應嘗試將傳回的中繼資料轉換成 FrameworkPropertyMetadata,然後視需要檢查個別屬性的值。
指定中繼資料
當您為將中繼資料套用至新的相依性屬性登錄,而建立新的中繼資料執行個體時,您可以選擇要使用的中繼資料類別︰基底 PropertyMetadata 或一些衍生類別,如 FrameworkPropertyMetadata。 一般應該使用 FrameworkPropertyMetadata,特別是如果您的屬性與屬性系統及版面配置和資料繫結等 WPF 函式有任何互動時。 更複雜情況的另一個選項是衍生自 FrameworkPropertyMetadata,建立在成員中攜帶額外資訊的專屬中繼資料報告類別。 或者,您可以使用 PropertyMetadata 或 UIPropertyMetadata 來傳遞實作功能的支援程度。
對於現有的屬性 (AddOwner 或 OverrideMetadata 呼叫),您應該一律以原先註冊所使用的中繼資料類型覆寫。
如果要建立 FrameworkPropertyMetadata 執行個體,有兩種方法可將溝通架構屬性特性的特定屬性值填入該中繼資料:
使用允許
flags
參數的 FrameworkPropertyMetadata 建構函式簽章。 此參數應該填入 FrameworkPropertyMetadataOptions 列舉旗標的所有所需合併值。使用其中一個不含
flags
參數的簽章,然後針對每個需要的特性變更,將 FrameworkPropertyMetadata 的每個報告布林值屬性設為true
。 如果這麼做,您必須先設定這些屬性,才能建構具有此相依性屬性的任何項目;布林值屬性為讀寫,以允許此避免flags
參數的行為,且仍可填入中繼資料,但在屬性使用前必須有效密封中繼資料。 因此,嘗試在要求中繼資料之後設定屬性,是無效的作業。
架構屬性中繼資料合併行為
當您覆寫架構屬性中繼資料時,不同的中繼資料特性會被合併或取代。
PropertyChangedCallback 已合併。 如果您新增 PropertyChangedCallback,該回撥會儲存在中繼資料中。 如果您未在覆寫中指定 PropertyChangedCallback,PropertyChangedCallback 的值會升階為中繼資料中指定之最接近上階的參考。
PropertyChangedCallback 的實際屬性系統行為,是階層中所有中繼資料擁有者的實作都會保留並新增至資料表,且屬性系統執行順序為最常衍生類別的回撥會最先叫用。 繼承的回撥只執行一次,視為將它們放在中繼資料的類別所擁有。
DefaultValue 已被取代。 如果您未在覆寫中指定 PropertyChangedCallback,DefaultValue 的值會來自中繼資料中指定之最接近上階的值。
CoerceValueCallback 實作已被取代。 如果您新增 PropertyChangedCallback,該回撥會儲存在中繼資料中。 如果您未在覆寫中指定 PropertyChangedCallback,PropertyChangedCallback 的值會升階為中繼資料中指定之最接近上階的參考。
屬性系統行為是只會叫用即時中繼資料中的 CoerceValueCallback。 不會保留階層中其他 CoerceValueCallback 實作的參考。
FrameworkPropertyMetadataOptions 列舉的旗標會合併為位元 OR 運算。 如果您指定 FrameworkPropertyMetadataOptions,則不會覆寫原始選項。 若要變更選項,請在 FrameworkPropertyMetadata 上設定對應的屬性。 例如,如果原始 FrameworkPropertyMetadata 物件設定 FrameworkPropertyMetadataOptions.NotDataBindable 旗標,您可以將 FrameworkPropertyMetadata.IsNotDataBindable 設定為
false
來變更旗標。
此行為是由 Merge 實作,可在衍生的中繼資料類別上覆寫。