Share via


XAML 載入和相依性屬性

XAML 處理器的目前 WPF 實作原本就是相依性屬性感知。 當載入二進位 XAML 和處理相依性屬性的屬性時,WPF XAML 處理器會使用屬性系統方法進行相依性屬性。 這可有效略過屬性的包裝函式。 當您實作自訂相依性屬性時,必須考慮此行為,而且應該避免將任何其他程式碼放在屬性系統方法和 GetValueSetValue 以外的屬性包裝函式中。

必要條件

本主題假設您已從相依性屬性的消費者和作者角度了解相依性屬性,並已閱讀相依性屬性概觀自訂相依性屬性。 您也應該在 WPF 中讀取 XAML 和 XAML 語法詳細 資料。

WPF XAML 載入器實作與效能

基於實作理由,將屬性識別為相依性屬性,並存取屬性系統 SetValue 方法來設定屬性,而不是使用屬性包裝函式及其 setter,會降低計算成本。 這是因為 XAML 處理器必須根據知道標記和各種字串結構所指示的類型和成員關聯性,推斷備份程式碼的整個物件模型。

此類型是透過 xmlns 和元件屬性的組合來查閱,但識別成員、判斷哪些專案可支援設定為屬性,以及解析屬性值支援的類型,否則需要使用 廣泛反映 PropertyInfo 。 由於特定類型的相依性屬性可透過屬性系統存取為儲存資料表,因此其 XAML 處理器的 WPF 實作會使用這個資料表,並推斷任何指定的屬性 ABC 都可以透過使用相依性屬性 識別碼 ABCProperty 在包含 DependencyObject 的衍生型別上呼叫 SetValue ,更有效率地設定。

自訂相依性屬性的影響

由於屬性設定的 XAML 處理器行為目前的 WPF 實作會完全略過包裝函式,因此您不應該將任何其他邏輯放入自訂相依性屬性之包裝函式的集合定義中。 如果您將這類邏輯放在集合定義中,則在 XAML 中設定 屬性而不是在程式碼中時,將不會執行邏輯。

同樣地,從 XAML 處理取得屬性值的 XAML 處理器的其他層面也會使用 GetValue ,而不是使用包裝函式。 因此,您也應該避免在呼叫以外的 GetValue 定義中執行任何其他實作 get

下列範例是建議的相依性屬性定義與包裝函式,其中將屬性識別項儲存為 publicstaticreadonly 欄位,而 getset 定義所包含的程式碼也都在定義支援相依性屬性的必要屬性系統方法範圍內。


public static readonly DependencyProperty AquariumGraphicProperty = DependencyProperty.Register(
  "AquariumGraphic",
  typeof(Uri),
  typeof(AquariumObject),
  new FrameworkPropertyMetadata(null,
      FrameworkPropertyMetadataOptions.AffectsRender,
      new PropertyChangedCallback(OnUriChanged)
  )
);
public Uri AquariumGraphic
{
  get { return (Uri)GetValue(AquariumGraphicProperty); }
  set { SetValue(AquariumGraphicProperty, value); }
}

Public Shared ReadOnly AquariumGraphicProperty As DependencyProperty = DependencyProperty.Register("AquariumGraphic", GetType(Uri), GetType(AquariumObject), New FrameworkPropertyMetadata(Nothing, FrameworkPropertyMetadataOptions.AffectsRender, New PropertyChangedCallback(AddressOf OnUriChanged)))
Public Property AquariumGraphic() As Uri
    Get
        Return CType(GetValue(AquariumGraphicProperty), Uri)
    End Get
    Set(ByVal value As Uri)
        SetValue(AquariumGraphicProperty, value)
    End Set
End Property

另請參閱