(一)屬性的前世今生
程式的本質是「資料+演算法」,或者說是用演算法來處理資料以期得到輸出結果。在程式中,資料表現為各種各樣的變數,演算法則表現為各種各樣的函式(操作符是函式的簡記法)。物件導向的類只是把散落在程式中的變更和函式進行歸檔封裝並控制對它們的訪問而已。被封裝在類裡的變更稱為字段,它表示類或例項的狀態;被封裝在類裡的函式稱為方法,表示類或例項的功能。欄位和方法構成了最原始的物件導向封裝。
在c#中對類有意義的字段和方法使用static關鍵字修飾、稱為靜態成員,通過類名加訪問操作符可以訪問它們;對類的例項有意義的字段和方法不加static關鍵字,稱為非靜態成員或例項成員。
從語義方面來看,靜態成員與非靜態成員有著很好的對稱性,但從程式在記憶體中的結構來看,這種對稱被打破。靜態欄位在記憶體中只有乙個拷貝,區別只是你能通過類名來訪問存放指令的記憶體還是通過例項名來訪問存放指令的記憶體。
(二) 依賴屬性(propdb)
定義:是一種可以自己沒有值,並能通過使用binding從資料來源獲得值(依賴在別人身上)的屬性。擁有依賴屬性的物件被稱為「依賴物件」。
優點:① 節省例項對記憶體的開銷。② 屬性值可以通過binding依賴在其他物件上。
2.1 依賴屬性用法(如下圖演示和**實現)
原始碼分析2.2 依賴屬性工作原理前端**
txt1" borderbrush="black" margin="5"/>
txt2" borderbrush="black" margin="5"/>
ok" margin="5" click="button_click"/>
後台**
public partial class 屬性 : window
; bindingoperations.setbinding(stu, student.nameproperty, binding);
txt2.setbinding(textbox.textproperty, binding);
}private
void button_click(object sender, routedeventargs e)
public
class student : dependencyobject
set }}
}
使用順序圖
原始碼分析(三)附加屬性(propa)定義:乙個屬性來來不屬於某個物件,但由於某種需求而被後來附加上(類同於裝飾模式)。也就是把物件放入乙個特定環境後物件才具有的屬性(表現出來就是被環境賦予的屬性)稱之為附加屬性(attached properties)。//dependencyproperty部分原始碼
public
sealed
class dependencyproperty ;
throw
new argumentexception(ms.internal.windowsbase.sr.get("propertyalreadyregistered", args));}}
if (defaultmetadata == null)
else
validatemetadatadefaultvalue(defaultmetadata, propertytype, name, validatevaluecallback);
}dependencyproperty dp = new dependencyproperty(name, propertytype, ownertype, defaultmetadata, validatevaluecallback);
defaultmetadata.seal(dp, null);
if (defaultmetadata.isinherited)
if (defaultmetadata.usingdefaultvaluefactory)
object obj3 = synchronized;
lock (obj3)
if (tracedependencyproperty.isenabled)
return dp;
} public
static dependencyproperty register(string name, type propertytype, type ownertype, propertymetadata typemetadata)
public
static dependencyproperty register(string name, type propertytype, type ownertype, propertymetadata typemetadata, system.windows.validatevaluecallback validatevaluecallback)
dependencyproperty property = registercommon(name, propertytype, ownertype, defaultmetadata, validatevaluecallback);
if (typemetadata != null)
return property;
} public
override
int gethashcode()
private
class fromnamekey
public
override
bool equals(object o)
public
bool equals(dependencyproperty.fromnamekey key)
public
override
int gethashcode()
public
void updatenamekey(type ownertype)
}}//dependencyobject類部分原始碼
public
class dependencyobject : dispatcherobject
public
void (dependencyproperty dp, object
value)
public
object(dependencyproperty dp)
}}
3.1 常見用法
設計理念:作為button控制項的設計者,他不可能預見到控制項發布後程式設計師是把它放在grid裡還是stackpanel(或者未來可以應對的新布局)裡,所以他也不可能為button準備諸如row,column等這類屬性,那麼乾脆讓布局來決定乙個button用什麼屬性來設定它的位置。可見,附加屬性的作用就是將屬性與資料型別(宿主)解耦,上資料型別的設計更加靈活。
posted @
2015-09-01 00:00
李華麗 閱讀(
...)
編輯收藏
WPF基礎系列之 資源
一 資源分類 程式級資源 也稱為二進位制資源,將資料儲存在程式主體之外的檔案裡。外部檔案與程式主體分離,為避免丟失或損壞,編譯器充許把外部檔案編譯程序式主體 成為程式主體不可分割的一部分,即為傳統意義上的程式資源。物件級資源 每個介面元素都可以攜帶自己的資源並可被自己的子級元素共享。wpf可同時支援...
WPF基礎篇 3 之WPF體系結構 WPF系列征程
wpf體系結構 wpf使用多層體系結構,在頂層,應用程式和乙個完全由託管的c 編寫的高層服務集合互動,將.net物件轉換為direct3d紋理和三角形的實際工作是由milcore的低階非託管組建完成的 下圖是wpf應用程式中各層的工作情況。presentationframework.dll包含了wp...
WPF之依賴屬性
依賴屬性 什麼時候需要定義依賴屬性 1 如果希望屬性可以在style中設定 2 如果希望屬性可以資料繫結 3 如果希望屬性可以由動態資源 dynamicresource 設定 4 如果希望從父元素那裡獲得值 5 如果希望屬性可以設定動畫 6 如果希望屬性在被修改時能夠檢測值得有效性,修改後 7 如果...