日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

《深入浅出WPF》学习笔记之深入浅出话属性

發布時間:2024/7/19 asp.net 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《深入浅出WPF》学习笔记之深入浅出话属性 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

依賴屬性是一種可以從父級元素繼承,并且可以通過Binding從數據源獲取,當從父級繼承時不占用內存的屬性系統。擁有依賴屬性的對象稱為依賴對象。WPF允許在創建對象時并不分配用于存儲數據的空間,而在需要時實時分配空間或直接借用父級數據,這種對象稱為依賴對象(DependencyObject),這種實時獲取數據的能力依靠依賴屬性(Dependency Property)來實現。必須使用依賴對象作為依賴屬性的宿主。DependencyObject是相當底層的一個基類,通過GetValue和SetValue獲取或設置依賴屬性的值。

聲明和使用依賴屬性

public class Student:DependencyObject{public readonly static DependencyProperty NameProperty = DependencyProperty.Register("Name", typeof(String), typeof(Student));public String Name{get { return (String)GetValue(Student.NameProperty); }set { SetValue(Student.NameProperty, value); }}}

依賴屬性一定被聲明為public static readonly,并且約定依賴屬性成員名稱添加后綴“Property”表明這是一個依賴屬性。依賴屬性實例通過Register方法創建,Register的第一個參數為此依賴屬性的CLR屬性包裝器的名稱,第二個參數為依賴屬性注冊的類型,第三個參數為依賴屬性的宿主類型。當依賴屬性沒有用CLR屬性包裝時,只能作為數據綁定的Target,使用CLR屬性包裝后,即可以作為Binding的Target,也可以作為Binding的Source。當依賴屬性作為Binding的Source時,即使不實現INotifyPropertyChanged接口在屬性值更改時也能通知Binding更改Target,依賴屬性自帶通知功能,因此當我們不想實現繁瑣的INotifyPropertyChanged接口時可以使用依賴屬性作為數據源。在Visual Studio中通過輸入propdp在連按兩次Tab鍵可以直接輸入依賴屬性模板,以加快編碼速度。

依賴屬性值存取的原理

創建一個DependencyProperty實例,并用它的CLR屬性名和宿主類型名生成hash code,最后使用hash code作為DependencyProperty實例的key存入全局的名為DependencyProperty.PropertyFromName的Hashtable中。這樣通過CLR屬性名和宿主類型名檢索出DependencyProperty實例,因此在同一個類型中不能聲明CLR屬性名相同的多個依賴屬性實例。

依賴屬性的值被統一存儲在DependencyObject中的EffectiveValueEntry[] _effectiveValues這樣的數組中,數組根據算法和DependencyProperty的GlobalIndex屬性進行排序,依賴屬性值的存取、刪除、等操作都是針對這個數組進行,DependencyProperty的實例只是依賴屬性值的標識,用來檢索屬性值。

附加屬性

顧名思義,附加屬性是說一個屬性本來不屬于某個類,但由于某種需求而被后來附加上。也就是說把對象放到一個特殊的環境中對象才有的屬性。附加屬性的作用就是讓屬性與數據類型解耦,讓數據類型的設計更加靈活,附加屬性定義在更高層次語義的對象上,在需要時附加到與之關聯的對象上。附加屬性本質上是依賴屬性,二者僅在注冊與包裝器上有區別。

public class School:DependencyObject{public static int GetGrade(DependencyObject obj){return (int)obj.GetValue(GradeProperty);}public static void SetGrade(DependencyObject obj, int value){obj.SetValue(GradeProperty, value);}// Using a DependencyProperty as the backing store for Grade. This enables animation, styling, binding, etc...public static readonly DependencyProperty GradeProperty =DependencyProperty.RegisterAttached("Grade", typeof(int), typeof(School), new PropertyMetadata(0));}

聲明附加屬性時僅注冊方法不同,參數和參數含義相同。附加屬性的包裝器與依賴屬性不同,分別聲明Get和Set方法用來存取附加屬性,附加屬性存取在要附加的對象上。實際上附加屬性就是使用定義在其他類中的DependencyProperty存取屬性值。附加屬性的本質為依賴屬性,因此可以使用Binding依賴其他對象的屬性值。示例代碼:

<Slider x:Name="slider" Minimum="0" Maximum="100"></Slider><Canvas Width="200" Height="200" Background="Gray"><Rectangle x:Name="rect" Width="20" Height="20" Canvas.Left="{Binding ElementName=slider, Path=Value,Mode=OneWay}" Fill="Red"></Rectangle></Canvas>//等價的后臺代碼Binding binding = new Binding("Value");binding.ElementName = "slider";binding.Mode = BindingMode.OneWay;rect.SetBinding(Canvas.LeftProperty, binding);

?

轉載于:https://www.cnblogs.com/jefflee/p/5822470.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的《深入浅出WPF》学习笔记之深入浅出话属性的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。