附加屬性的使用


附加屬性

一、為什么需要定義附加屬性:

  • 附加屬性是一種依賴屬性,與依賴屬性不同的是,附加屬性被應用的類不是定義附加屬性的類。

  • 某個依賴屬性本來不屬於某個對象,但由於某種需求,該對象需要這個依賴屬性,這時就需要將該依賴屬性定義為附加屬性。

二、創建附加屬性的快捷方式:輸入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>

總結:給任何需要的控件(類)提供該屬性的使用入口。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM