WPF中的邏輯樹與可視樹

2021-05-23 01:53:52 字數 1562 閱讀 2725

這部分的內容來自於即將出版的新書《wpf unleashed》的第三章樣章。關於什麼是邏輯樹,我們先看下面的乙個偽xaml**的例子:

labeltext

在這樣乙個簡單ui中,window是乙個根結點,它有乙個子結點stackpanel。而stackpanel有乙個子結點label。注意label下還有乙個子結點string(labeltext),它同時也是乙個葉子結點。這就構成了視窗的乙個邏輯樹。邏輯樹始終存在於wpf的ui中,不管ui是用xaml編寫還是用**編寫。wpf的每個方面(屬性、事件、資源等等)都是依賴於邏輯樹的。

可視樹基本上是邏輯樹的一種擴充套件。邏輯樹的每個結點都被分解為它們的核心視覺元件。邏輯樹的結點對我們而言基本是乙個黑盒。而可視樹不同,它暴露了視覺的實現細節。下面是visual tree結構就表示了上面四行xaml**的視覺樹結構:

並不是所有的邏輯樹結點都可以擴充套件為可視樹結點。只有從system.windows.media.visual和system.windows.media.visual3d繼承的元素才能被可視樹包含。其他的元素不能包含是因為它們本身沒有自己的提交(rendering)行為。

在windows vista sdk tools當中的xamlpad提供檢視visual tree的功能。需要注意的是xamlpad目前只能檢視以page為根元素,並且去掉了sizetocontent屬性的xaml文件。如下圖所示:

注意圖中工具欄特別標記的地方。我們可以看到visual tree確實比較複雜,其中還包含有很多的不可見元素,比如contentpresenter。visual tree雖然複雜,但是在一般情況下,我們不需要過多地關注它。我們在從根本上改變控制項的風格、外觀時,需要注意visual tree的使用,因為在這種情況下我們通常會改變控制項的視覺邏輯。

wpf中還提供了遍歷邏輯樹和可視樹的輔助類:system.windows.logicaltreehelper和system.windows.media.visualtreehelper。注意遍歷的位置,邏輯樹可以在類的建構函式中遍歷。但是,可視樹必須在經過至少一次的布局後才能形成。所以它不能在建構函式遍歷。通常是在oncontentrendered進行,這個函式為在布局發生後被呼叫。

其實每個tree結點元素本身也包含了遍歷的方法。比如,visual類包含了三個保護成員方法visualparent、visualchildrencount、getvisualchild。通過它們可以訪問visual的父元素和子元素。而對於frameworkelement,它通常定義了乙個公共的parent屬性表示其邏輯父元素。特定的frameworkelement子類用不同的方式暴露了它的邏輯子元素。比如部分子元素是children collection,有是有時content屬性,content屬性強制元素只能有乙個邏輯子元素。

WPF中的可視樹和邏輯樹

1 以當前控制項為節點,往上層級的樹走即是可視樹,往控制項內部細化是可視樹。2 可視樹是邏輯樹的一種擴充套件。3 wpf的每個方面 屬性 事件 資源等等 都是依賴邏輯樹的。4 只有是從system.windows.media.visual和system.windows.media.visual3d繼...

WPF的兩棵樹與繫結

原文 wpf的兩棵樹與繫結 public class visualpanel frameworkelement public visualpanel protected override int visualchildrencount protected override visual getvis...

課堂筆記 樹的邏輯結構 樹的儲存結構

樹的邏輯結構 樹 n n 0 個結點的有限集合。當n 0時,稱為空樹 任意一棵非空樹滿足以下條件 有且僅有乙個特定的稱為根的結點 當n 1時,除根結點之外的其餘結點被分成m m 0 個互不相交的有限集合t1,t2,tm,其中每個集合又是一棵樹,並稱為這個根結點的子樹。樹的定義是採用遞迴方法 樹的基本...