漫遊WPF基類

2021-09-06 01:57:32 字數 2224 閱讀 9876

這個類要有多重要就有多重要,是wpf依賴屬性的基礎(依賴屬性又與其他特性息息相關),在設計wpf類時,如果該物件並不會當做乙個元素呈現,且你想擁有繫結等功能,那麼繼承該類將帶來極大的靈活性.

public class 

testdp:dependencyobject

set

}public static readonly

dependencyproperty numberproperty =

dependencyproperty.register("number", typeof(int), typeof(testdp),

new

uipropertymetadata(0));

}

通過getvalue和setvalue方法使用dp屬性,如果你不想繼承該類,那麼還有乙個選擇,那就是附加屬性,可能你的很多類已經設計好了,已經有了基類.

public class 

testattachdp

public static void settimelinesynchronoushost(dependencyobject obj, int value)

public static readonly

dependencyproperty numberproperty =

dependencyproperty.registerattached("number", typeof(int), typeof(testattachdp),

new

uipropertymetadata(0));

}

依賴屬性是構建靈活的wpf系統的基礎

該類構建了乙個視覺樹的概念,並提供了一些與繪圖有關的屬性,但與其本身wpf繪圖引擎無關,其只提供屬性.

有那麼一種元素其本身並不會繪製任何圖形,但其卻還是存在視覺樹中.它的存在可以用作資料儲存或者當做與布局無關的容器使用.

實際中繼承此類的意義不大,因為其不具備繪圖功能.其意義在於打下紮實的基類基礎

public class 

norendervisual:visual

}protected override

visual getvisualchild(int index)

}

新增這樣的視覺樹意義不大,我們也無需繼承重寫,因為內建有更好的選擇

乙個繼承自visual的類,使得其有乙個基本的容器(children)結構,該類充當視覺樹容器更加適合,否則你只能選擇visual來重寫了,實際上該類你可能並不常用,由於其自身並沒有布局系統,即使新增了元素也無法呈現,作為輔助使用

public class 

owncontainervisual:containervisual

; this.children.add(element);}}

現在不再使用addvisualchild方法新增visual,而是使用children集合drawingvisual是真正乙個輕量級並派的上用場的類,因為其擁有reneropen方法,獲取drawingcontext,這樣就開始畫圖了

public class 

rectanlgevisual : drawingvisual}}

何謂輕量級即,只有最基礎的繪圖功能,但沒有相關的事件,布局,模板等特性,但是效率會更好.複雜度會更高.使用方面不是特別的方便.

如果說drawingvisual是輕量級,那麼uielement就是重量級的了,到了這一步元素擁有的基礎的事件和布局系統,可以用過重寫onrender方法重繪控制項的外觀

就此打住,接下來的目標還是研究其布局系統

WPF窗體自定義基類

最近公司開始乙個專案開發,打算使用wpf實現,由於wpf算是比較新的知識吧,公司也沒有什麼人懂,都是臨時抱佛腳的。專案中有不少窗體會共用到一些東西,比如窗體樣式風格之類的。這很自然的就想到使用繼承嘛,以往我們在winfrom下只要簡單建乙個類,讓窗體繼承自己自定義的基類即可,但,wpf窗體卻不一樣,...

多重基類和虛擬基類

多重繼承 multiple inheritance,mi 虛基類虛基類使得從多個類 它們的基類相同 派生出的物件只繼承乙個基類物件。通過使用關鍵字virtual。例如,可以使worker被用作singer和waiter的虛基類 virtual和public的次序無關緊要 當基類是虛基類,派生類將包含...

C 抽象基類與虛基類(C primer)

c primer plus p508,抽象基類 c primer plus p556,虛基類 抽象基類是解決如下問題 加入現在需要開發乙個圖形類,表示圓與橢圓 注意,圓是一種特殊的橢圓 所以初步考慮從橢圓類中派生出圓類。但是現在遇到乙個問題,圓與橢圓的面積計算公式不同,所以需要建立乙個abc,抽象出...