WPF依賴屬性-依賴屬性介紹
阿新 • • 發佈:2021-06-28
WPF的設計理念是:資料驅動,UI與邏輯鬆耦合
一、傳統的CLR屬性
public class Person
{
private string _Name;
public string Name
{
get
{
return _Name;
}
set
{
_Name = value;
}
}
}
二、CLR屬性特點:
- CLR屬性,是例項屬性;
- 在多級繼承的情況下,孫孫輩物件佔用記憶體空間不可避免的膨脹;
三、依賴屬性
// 1. 使型別繼承DependencyObject類 public class Person : DependencyObject { // 2. 宣告一個靜態只讀的DependencyProperty 欄位 public static readonly DependencyProperty nameProperty; static Person() { // 3. 註冊定義的依賴屬性 nameProperty = DependencyProperty.Register("Name", typeof(string), typeof(Person), new PropertyMetadata("Learning Hard",OnValueChanged)); } // 4. 屬性包裝器,通過它來讀取和設定我們剛才註冊的依賴屬性 public string Name { get { return (string)GetValue(nameProperty); } set { SetValue(nameProperty, value); } } private static void OnValueChanged(DependencyObject dpobj, DependencyPropertyChangedEventArgs e) { // 當只發生改變時回撥的方法 } }
四、依賴屬性的特點
1、依賴屬性宣告為:類的靜態只讀物件;
2、依賴屬性是通過DependencyObject註冊的屬性;
3、依賴屬性讀取是通過DependencyObject的方法讀取;
4、類的依賴屬性只有一份,且由DependecyObject維護。
5、多級繼承,且大多數字段值不改變的情況下,減少記憶體佔比
DependencyProperty將一個物件依賴屬性儲存在一個全域性的Hashtable中;通過依賴物件(DependencyObject)的GetValue和SetValue存取資料;
6、 依賴屬性值可以通過Binding依賴於其它物件上,這就使得資料來源一變動;依賴於此資料來源的依賴屬性全部進行更新
五、依賴屬性特性應用
1、依賴屬性(值傳遞)繼承
中邏輯樹上實際父級變動,在子級沒有顯式指定值時,預設採用父級的值
如下圖中:窗體上所有的字型都變大(從20變成了50),並不需要通過設定每個控制元件的屬性;只需要設定窗體的屬性,這個窗體的子控制元件就會適應這一改變,並且使用相同的設定
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
Title="WPF Example" SizeToContent="WidthAndHeight"
FontSize="50" FontStyle="Italic"
Background="Blue">
<StackPanel>
<Label FontWeight="Bold" FontSize="20" Foreground="White">
Hi There!
</Label>
<Label>2015 Solidmango</Label>
<ListBox>
<ListBoxItem>Item1</ListBoxItem>
<ListBoxItem>Item2</ListBoxItem>
</ListBox>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<Button MinWidth="75" Margin="10">Help</Button>
<Button MinWidth="75" Margin="10">OK</Button>
</StackPanel>
<StatusBar>Solidmango</StatusBar>
</StackPanel>
</Window>
2、屬性的改變通知
CLR屬性只有通過事件響應函式或者回調函式來傳遞屬性性改變; 依賴屬性只需配置就可以(見第三部分的示例)
更詳細的介紹參見依賴屬性的傳遞