WPF系列(一)依賴項屬性

依賴項屬性是標準.NET屬性的全新實現——具有大量新增價值。在WPF的核心特性中需要嵌入依賴性屬性。WPF元素提供的大多數屬性都是依賴項屬性。相對於創建依賴項屬性,大多數情況下只是使用他們。當我們自定義控件時,會創建依賴屬性。。現在通過自定義調音臺控件介紹WPF中依賴屬性的知識。
自定義控件調音臺SingnalLight,實現功能(示例程序摘自 魚哥的地盤

  • 接收來自外部的範圍0~100的數值
  • 實時顯示接收數值
  • 列表內容
  • 數值範圍0~50顯示綠色,50~85顯示黃色,85~100顯示紅色,沒有數值顯示褐色
  • 可在父控件上拖拽該控件
    自定義SingnalLight效果圖

以下是其中一段定義依賴屬性的代碼

   public int ValueA
        {
            get { return (int)GetValue(ValueAProperty); }
            set { SetValue(ValueAProperty, value); }
        }

        // Using a DependencyProperty as the backing store for ValueA.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty ValueAProperty =
            DependencyProperty.Register("ValueA", typeof(int), typeof(SingnalLight), new PropertyMetadata(0));

第一步定義表示屬性的對象,它是DependencyProject類的實例。
第二步是註冊依賴屬性。需要提供以下幾個參數

    //
        // 摘要:
        //     使用指定的屬性名稱、屬性類型和所有者類型註冊依賴項屬性。
        //
        // 參數:
        //   name:
        //     要註冊的依賴項對象的名稱。在所有者類型的註冊命名空間內,名稱必須是唯一的。
        //
        //   propertyType:
        //     屬性的類型。
        //
        //   ownerType:
        //     正註冊依賴項對象的所有者類型。
        //
        // 返回結果:
        //     一個依賴項對象標識符,應使用它在您的類中設置 public static readonly 字段的值。然後,在以後使用該標識符引用依賴項對象,用於某些操作,例如以編程方式設置其值,或者獲取元數據。
        [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
        public static DependencyProperty Register(string name, Type propertyType, Type ownerType);
        //
        // 摘要:
        //     使用指定的屬性名稱、屬性類型、所有者類型和屬性元數據註冊依賴項屬性。
        //
        // 參數:
        //   name:
        //     要註冊的依賴項對象的名稱。
        //
        //   propertyType:
        //     屬性的類型。
        //
        //   ownerType:
        //     正註冊依賴項對象的所有者類型。
        //
        //   typeMetadata:
        //     依賴項對象的屬性元數據。
        //
        // 返回結果:
        //     一個依賴項對象標識符,應使用它在您的類中設置 public static readonly 字段的值。然後,在以後使用該標識符引用依賴項對象,用於某些操作,例如以編程方式設置其值,或者獲取元數據。
        [TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
        public static DependencyProperty Register(string name, Type propertyType, Type ownerType, PropertyMetadata typeMetadata);
        //
        // 摘要:
        //     使用指定的屬性名稱、屬性類型、所有者類型、屬性元數據和屬性的值驗證回調來註冊依賴項屬性。
        //
        // 參數:
        //   name:
        //     要註冊的依賴項對象的名稱。
        //
        //   propertyType:
        //     屬性的類型。
        //
        //   ownerType:
        //     正註冊依賴項對象的所有者類型。
        //
        //   typeMetadata:
        //     依賴項對象的屬性元數據。
        //
        //   validateValueCallback:
        //     對回調的引用,除了典型的類型驗證之外,該引用還應執行依賴項對象值的任何自定義驗證。
        //
        // 返回結果:
        //     一個依賴項對象標識符,應使用它在您的類中設置 public static readonly 字段的值。然後,在以後使用該標識符引用依賴項對象,用於某些操作,例如以編程方式設置其值,或者獲取元數據。
        public static DependencyProperty Register(string name, Type propertyType, Type ownerType, PropertyMetadata typeMetadata, ValidateValueCallback validateValueCallback);

另外有個小技巧,在VS中輸入propdp會直接生成創建依賴項屬性的代碼,再通過簡單的修改即可。

本文地址:http://blog.csdn.net/shi_tou_ge/article/details/50881023
2016年03月13日完成

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章