WPF元素樹各種用途解析
WPF元素樹是WPF中一個(gè)非常重要的結(jié)構(gòu)。在初學(xué)者學(xué)習(xí)使用WPF的時(shí)候,需要深入的了解這一結(jié)果,才能方便以后的熟練操作。#t#
如果使用 XAML 創(chuàng)建應(yīng)用程序頁(yè),則將基于標(biāo)記中元素的嵌套關(guān)系創(chuàng)建樹結(jié)構(gòu)。
如果使用代碼創(chuàng)建應(yīng)用程序,則將基于為屬性(實(shí)現(xiàn)給定元素的內(nèi)容模型)指定屬性值的方式創(chuàng)建樹結(jié)構(gòu)。
在 Windows Presentation Foundation (WPF) 中,處理和使用概念說明元素樹的方法實(shí)際上有兩種:即邏輯樹和可視化樹。
WPF元素樹之邏輯樹用途
邏輯樹的存在用途是使內(nèi)容模型可以容易地循環(huán)訪問其可能包含的子元素,從而可以對(duì)內(nèi)容模型進(jìn)行擴(kuò)展。此外,邏輯樹還為某些通知提供了框架,例如當(dāng)加載邏輯樹中的所有元素時(shí)。
此外,在 Resources 集合的邏輯樹中首先向上查找初始請(qǐng)求元素,然后再查找父元素,這樣可以解析資源引用。當(dāng)同時(shí)存在邏輯樹和可視化樹時(shí),將使用邏輯樹進(jìn)行資源查找。
WPF元素樹之可視化樹
WPF 中除了邏輯樹的概念,還存在可視化樹的概念??梢暬瘶涿枋鲇?Visual 基類表示的可視化對(duì)象的結(jié)構(gòu)。為控件編寫模板時(shí),將定義或重新定義適用于該控件的可視化樹。對(duì)于出于性能和優(yōu)化原因想要對(duì)繪圖進(jìn)行較低級(jí)別控制的開發(fā)人員來說,他們也會(huì)對(duì)可視化樹感興趣。作為常規(guī) WPF 應(yīng)用程序編程一部分的可視化樹的一個(gè)公開情況是,路由事件的事件路由大多數(shù)情況下遍歷可視化樹,而不是邏輯樹。這種微妙的路由事件行為可能不會(huì)很明顯,除非您是控件作者。在可視化樹中路由使得在可視化級(jí)別實(shí)現(xiàn)組合的控件能夠處理事件或創(chuàng)建事件 setter。
WPF元素樹之樹遍歷
LogicalTreeHelper 類為邏輯樹遍歷提供 GetChildren、GetParent 和 FindLogicalNode 方法。在大多數(shù)情況下,不需要遍歷現(xiàn)有控件的邏輯樹,因?yàn)檫@些控件幾乎總是將其邏輯子元素公開為專用集合屬性,該屬性支持集合 API(如 Add、索引器等等)。對(duì)于不選擇從預(yù)期控件模式(例如已定義了集合屬性的 ItemsControl 或 Panel)派生以及打算提供其自己的集合屬性支持的控件作者,樹遍歷主要是他們使用的一種方案。
可視化樹還支持用于可視化樹遍歷的幫助器類 VisualTreeHelper。無(wú)法通過控件特定的屬性方便地公開可視化樹,因此,如果您的編程方案必須遍歷可視化樹,建議您使用 VisualTreeHelper 類。
WPF元素樹之“樹”形式路由事件的路由
如前所述,路由事件的路由可有效地向上遍歷或向下遍歷樹,這要取決于該事件是隧道路由事件還是冒泡路由事件。事件路由概念沒有直接支持的幫助器類,因此無(wú)法使用這樣的類來獨(dú)立“遍歷”引發(fā)實(shí)際進(jìn)行路由的事件的事件路由。存在表示路由的類 EventRoute,但該類的方法通常僅供內(nèi)部使用。
WPF元素樹之資源和樹
資源查找基本上遍歷邏輯樹。不在邏輯樹中的對(duì)象可以引用資源,但查找將從該對(duì)象連接到邏輯樹的位置開始。僅邏輯樹節(jié)點(diǎn)可以有包含 ResourceDictionary 的 Resources 屬性,因此這意味著,遍歷可視化樹來查找資源沒有好處。
但是,資源查找也可以超出直接邏輯樹。對(duì)于應(yīng)用程序標(biāo)記,資源查找可以向上繼續(xù),直到應(yīng)用程序資源以及主題支持和系統(tǒng)值。如果資源引用是動(dòng)態(tài)的,則主題本身也可以引用主題WPF元素樹之外的系統(tǒng)值。