1. 程式人生 > >依賴屬性

依賴屬性

spa data- follow 資源 stat 屬性的屬性 con cimage -i

概念

依賴屬性就是自己自己沒有值,通過Binding從數據源獲得值,就是依賴在別人身上,擁有依賴屬性的對象稱為依賴對象

應用依賴屬性的場景

1、在樣式中設置屬性。
2、屬性支持數據綁定。
3、使用動態資源引用設置屬性。
4、從元素樹中的父元素自動繼承屬性值。
5、屬性可進行動畫處理。
6、屬性系統在屬性系統、環境或用戶執行的操作或者讀取並使用樣式更改了屬性以前的值時報告。
7、使用已建立的、WPF 進程也使用的元數據約定,
例如報告更改屬性值時是否要求布局系統重新編寫元素的可視化對象。依賴對象創建時並不包含存儲數據空間。WPF中必須使用依賴對象作為依賴屬性的宿主。

用於數據綁定

依賴屬性是針對一個類的靜態屬性
每個類實例去這個靜態屬性裏面Get屬於自己的那一個屬性

對象有屬性,屬性的值去公共數據區域【所有類實例的依賴屬性都放在一個靜態變量(公共區域)裏面】裏面取
優勢:公共數據區域不在UI線程,所以可以隨時修改數值

Tips

WPF界面元素為依賴對象,所有屬性為依賴屬性,所以支持綁定

技術分享圖片

示例

自定義控件

public class CustomBorder : Border
{
    public CustomBorder()
    {
        //初始化時默認給定一個背景色 
        Background = Brushes.Blue;
    }
    

    //屬性
    public Double Transparency
    {
        get { return (Double)GetValue(TransparencyDependency); }
        set { SetValue(TransparencyDependency, value); }
    }

    //註冊依賴屬性
    public readonly static DependencyProperty TransparencyDependency =
        DependencyProperty.Register( 
        //屬性名
        "Transparency",
        //屬性數據類型
        typeof(Double),
        //擁有者
        typeof(CustomBorder),
        //處理方法
        new PropertyMetadata(new PropertyChangedCallback(transparencyPropertyChangedCallback))
        );

    //當屬性修改時的處理
    static void transparencyPropertyChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        CustomBorder border = (sender as CustomBorder);
        if (border != null)
        {
            border.Opacity = 1 - Convert.ToDouble(e.NewValue) / 255;
        }
    }
}

DependencyProperty的Register方法

有幾種重載方法,下面展示兩種

技術分享圖片

//
// 摘要:
//     使用指定的屬性名稱、屬性類型、所有者類型和屬性元數據註冊依賴屬性。
//
// 參數:
//   name:
//     要註冊的依賴屬性的名稱。
//
//   propertyType:
//     屬性的類型。
//
//   ownerType:
//     正在註冊依賴屬性的所有者類型。
//
//   typeMetadata:
//     依賴屬性的屬性元數據。
//
// 返回結果:
//     一個依賴屬性標識符,應使用它來設置類中 public static readonly 字段的值。 稍後將此標識符用來引用依賴屬性,從而實現以編程方式設置其值或獲取元數據等操作。
public static DependencyProperty Register(string name, Type propertyType, Type ownerType, PropertyMetadata typeMetadata);

前臺

<Grid>
    <local:CustomBorder x:Name="bord" Transparency="{Binding ElementName=slider1, Path=Value}"></local:CustomBorder>
    <Slider Grid.Row="1" HorizontalAlignment="Left" Name="slider1" Width="130" Value="0" Minimum="0" Maximum="255" />
</Grid>

示例代碼

https://github.com/zLulus/NotePractice/tree/dev3/WPF/WpfDemo/DependencyProperties

依賴屬性