附加屬性
一、為什么需要定義附加屬性:
-
附加屬性是一種依賴屬性,與依賴屬性不同的是,附加屬性被應用的類不是定義附加屬性的類。
- 某個依賴屬性本來不屬於某個對象,但由於某種需求,該對象需要這個依賴屬性,這時就需要將該依賴屬性定義為附加屬性。
二、創建附加屬性的快捷方式:輸入propa,再敲兩次Tab鍵
三、不使用屬性封裝器:因為附加屬性是可以被用於任何對象。
- 通過調用兩個靜態方法分別包裝SetValue()和GetValue(),這兩個方法應當命名為SetPropertyName()和GetPropertyName()。
1 public static bool GetIsRotate(DependencyObject obj) 2 { 3 return (bool)obj.GetValue(IsRotateProperty); 4 } 5 6 public static void SetIsRotate(DependencyObject obj, bool value) 7 { 8 obj.SetValue(IsRotateProperty, value); 9 }
四、附加屬性的定義:
(1)利用快捷鍵生成的附加屬性模板如下:需要使用RigisterAttached方法。
1 public static readonly DependencyProperty MyPropertyProperty = 2 DependencyProperty.RegisterAttached("MyProperty", typeof(int), typeof(ownerclass), new PropertyMetadata(0));
(2)注冊附加屬性的方式有多種,上述是最常用的一種。注冊參數最多有五個:
1 public static DependencyProperty RegisterAttached(string name, Type propertyType, Type ownerType, PropertyMetadata defaultMetadata, ValidateValueCallback validateValueCallback);
(3)在模板基礎上編輯自己的附加屬性IsRotate:
1 public static readonly DependencyProperty IsRotateProperty = 2 DependencyProperty.RegisterAttached("IsRotate", typeof(bool), typeof(YMDemo), new PropertyMetadata(false));
-
參數一(IsRotate):要注冊的附加屬性的名稱。
-
參數二(typeof(bool)):聲明屬性IsRotate的類型是bool。
-
參數三(typeof(YMDemo)):依賴屬性IsRotate的所有者類型,即定義該附加屬性的類是YMDemo。
-
參數四的類型是PropertyMetadata類:該類有5個重載的構造函數,參數最多是三個,示例中使用的是傳參為DefaultValue的構造函數。
1 public PropertyMetadata(object defaultValue); 2 3 public PropertyMetadata(object defaultValue, PropertyChangedCallback propertyChangedCallback, CoerceValueCallback coerceValueCallback);
-
DefaultValue:附加屬性未被顯式賦值時,使用該默認值。
-
PropertyChangedCallback:附加屬性的值被改變之后,此委托會被調用,此委托可關聯一個影響函數。
-
CoerceValueCallback:附加屬性值被強制改變時此委托會被調用,對賦值進行檢查,強制對值進行賦值,返回值為Object類型,這個才是要賦給屬性的值,此委托可關聯一個影響函數。
五、屬性value更改后,發生校正的流程:

六、依賴屬性的使用
(1)在YMDemo.xaml.cs中定義附加屬性IsRotate;
(2)在MainWindow.xaml中如果想要Grid控件使用IsRotate屬性:
<Window x:Class="DependencyPropertyDemo.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:DependencyPropertyDemo" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800">
<Grid local:YMDemo.IsRotate="True"/> </Window>
總結:給任何需要的控件(類)提供該屬性的使用入口。
