麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 擴(kuò)展 > SilverLight > 正文

詳解Silverlight的對(duì)象樹

2024-09-06 20:41:34
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

在托管代碼或 JavaScript 中,您可以在運(yùn)行時(shí)期間引用 Silverlight 的 Silverlight 對(duì)象樹中的 對(duì)象。本主題介紹如何在 Silverlight 托管 API 中使用對(duì)象樹。

對(duì)象樹

對(duì)象樹概念描述如何使在運(yùn)行時(shí)在 Silverlight 內(nèi)容中創(chuàng)建和存在的對(duì)象彼此相關(guān)。關(guān)系基于對(duì)象具 有屬性這一原則,在很多情況下屬性的值是另一個(gè)對(duì)象,而此對(duì)象也具有屬性。對(duì)象樹具有分支,因?yàn)槠?中某些屬性是集合屬性并具有多個(gè)對(duì)象;并且,對(duì)象樹具有根,因?yàn)轶w系結(jié)構(gòu)最終必須引用單個(gè)對(duì)象,而 該對(duì)象是與對(duì)象樹之外的概念(例如,瀏覽器宿主或顯示內(nèi)容的 Silverlight 插件)之間的連接點(diǎn)。

盡管在概念上實(shí)際只有一個(gè)對(duì)象樹,但 Silverlight API 不向您公開完整的樹。大量的對(duì)象樹結(jié)構(gòu)實(shí) 際上是實(shí)現(xiàn)詳細(xì)信息。而您具有對(duì)象特定的屬性,這些屬性影響樹中特定點(diǎn)的子項(xiàng)值并且可能報(bào)告父項(xiàng)( 在大多數(shù)情況下,父軸是只讀的,因?yàn)槟ǔJ窃诖a中或通過(guò) XAML 分析過(guò)程從根向上構(gòu)建樹)。例如 ,Panel 具有其 Children 屬性,該屬性設(shè)置子對(duì)象。FrameworkElement 具有用于報(bào)告父項(xiàng)的 Parent。 這兩個(gè) API 都在基類中,因此,它們可用于大量的 Silverlight 對(duì)象。

Silverlight 中一個(gè)相關(guān)的樹概念是可視化樹。可視化樹概念指的是較大的對(duì)象樹在經(jīng)過(guò)編輯或篩選 后的表示形式。所應(yīng)用的篩選器是在可視化樹中只存在具有呈現(xiàn)含義的對(duì)象。例如,某個(gè)集合類不是可視 化樹的一部分,而可視化樹將集合抽象為一個(gè)“子項(xiàng)”概念。然而,如果您將加載的源 XAML 標(biāo)記視為與 對(duì)象樹近似的結(jié)構(gòu),則可視化樹也可以包含并不直接顯示的對(duì)象。這是因?yàn)椋梢暬瘶湟矆?bào)告作為特定控 件(這些控件來(lái)自所應(yīng)用的控件模板或資源字典)的組成部分的對(duì)象。可視化樹在內(nèi)部用于 Silverlight 呈現(xiàn)過(guò)程,但了解一些有關(guān)可視化樹的內(nèi)容對(duì)于某些情形通常很重要,例如,在應(yīng)用模板后編寫或替換控 件模板或在運(yùn)行時(shí)分析控件實(shí)例。對(duì)于這些情形,Silverlight 提供了 VisualTreeHelper API,它通過(guò) 一種方式檢查可視化樹,這種方式比您通過(guò)對(duì)象特定的父屬性和子屬性來(lái)實(shí)際實(shí)現(xiàn)更為一般化。

可視化樹概念也存在于 WPF 中,它與 Silverlight 的可視化樹概念類似。然而,一個(gè)顯著的差異是 WPF 還提供一個(gè)附加的篩選器或?qū)ο髽洌ǚQ為“邏輯樹”)的概念。邏輯樹概念與某些屬性系統(tǒng)行為相關(guān) 。Silverlight 不通過(guò)幫助器類來(lái)公開此邏輯樹。Silverlight 中的確存在某些(但并非所有)相關(guān)的屬 性行為,但由于沒(méi)有用于訪問(wèn)這些行為的幫助器 API,因此,邏輯樹概念在 Silverlight 中將沒(méi)有用武 之地,因此本文檔不討論它。缺少邏輯樹而引發(fā)的一個(gè)很小的兼容性問(wèn)題是:FrameworkElement.Parent 屬性行為在 Silverlight 版本 3 中是不同的,它實(shí)際上報(bào)告可視化樹父項(xiàng)。

對(duì)象樹和 XAML 標(biāo)記

如果您將通過(guò) Silverlight API 訪問(wèn)的對(duì)象樹與 XAML 標(biāo)記的樹形狀進(jìn)行比較,它們?cè)诠?jié)點(diǎn)方面并不 完全匹配。這是因?yàn)?XAML 用于標(biāo)記,并且在標(biāo)記定義期間易于使用。例如,XAML 具有屬性元素的概念 ,它提供相關(guān)的指導(dǎo)信息,當(dāng)您發(fā)現(xiàn)一個(gè)元素嵌套在另一個(gè)元素內(nèi)時(shí),您可以選擇要設(shè)置的屬性。在對(duì)象 樹中,這就像一個(gè)對(duì)象上的某個(gè)屬性由另一個(gè)對(duì)象進(jìn)行設(shè)置一樣。相反,XAML 也具有內(nèi)容屬性的概念, 其中,所設(shè)置的屬性在標(biāo)記中甚至沒(méi)有顯式進(jìn)行命名。XAML 具有的語(yǔ)法可以基于屬性的字符串值創(chuàng)建對(duì) 象,也可以針對(duì) XAML 標(biāo)記中已存在但在其他位置定義的對(duì)象提供引用,或者完全位于標(biāo)記外部。盡管存 在這些很小的不一致,但當(dāng)您在 XAML 中定義用戶界面時(shí),您將在運(yùn)行時(shí)定義最終 Silverlight 對(duì)象樹 的近似結(jié)構(gòu)。

引用對(duì)象屬性

無(wú)論您通過(guò)何種方式從 Silverlight 對(duì)象樹中獲取對(duì)象引用,都將通過(guò) object.property 表示法( 與 .NET 中 CLR 屬性的核心概念相關(guān))直接公開托管 API 中的屬性。許多 Silverlight 2 屬性的基礎(chǔ) 是依賴項(xiàng)屬性概念。依賴項(xiàng)屬性和屬性系統(tǒng)引入了一些其他可能的語(yǔ)法,用于通過(guò)與 object.property 不同的方式訪問(wèn)屬性,但與附加屬性的情況不同,這些屬性并不常用,因此本主題不討論它們。主題依賴 項(xiàng)屬性概述中詳細(xì)討論了依賴項(xiàng)屬性。

對(duì)象樹中的附加屬性

Silverlight 支持附加屬性的概念。從對(duì)象樹的角度來(lái)看,附加屬性是可以附加到樹中任何對(duì)象的屬 性,而不考慮該對(duì)象的類型(盡管在 Silverlight 實(shí)現(xiàn)中,該對(duì)象至少必須是依賴項(xiàng)對(duì)象)。附加屬性 值存在于對(duì)象樹中,但是,如果您使用代碼來(lái)訪問(wèn)它們,則必須使用與 object.property 表示法不同的 語(yǔ)法。

對(duì)象樹中的資源和模板

Silverlight 支持一個(gè)稱為資源字典的資源概念。資源字典用于指定自身需要大量子屬性設(shè)置的屬性值。

ResourceDictionary 最常見的方案是在 XAML 中定義 ResourceDictionary 元素,然后通過(guò) XAML 屬 性 (attribute) 和 StaticResource 標(biāo)記擴(kuò)展將已定義的資源用作屬性 (property) 值。對(duì)于某些情況 ,可以共享此資源。例如,您可以定義一個(gè) LinearGradientBrush(它在 ResourceDictionary 中包含多 個(gè)漸變停止點(diǎn)),然后將其應(yīng)用于可視化設(shè)計(jì)中的多個(gè) Brush 屬性(可能在位于不同頁(yè)的用戶界面中) 。

模板將按稍微不同的概念運(yùn)行(無(wú)論是在頁(yè)級(jí)別還是在應(yīng)用程序級(jí)別資源字典中定義,也無(wú)論是在 generic.xaml 中還是以內(nèi)聯(lián)方式)。模板自身是一個(gè)對(duì)象,但模板可能多次應(yīng)用于可視化樹。在應(yīng)用后 ,模板中的元素通常使用 TemplateBinding,這樣,就可以應(yīng)用模板并仍然設(shè)置由模板化對(duì)象保留的特定 值。有關(guān)模板的基礎(chǔ)概念將在主題通過(guò)使用 ControlTemplate 自定義現(xiàn)有控件的外觀中討論。

遍歷對(duì)象樹

遍歷對(duì)象樹在對(duì)象模型中是一種通用的方法。遍歷樹意味著您可以使用針對(duì)包含對(duì)象引用子對(duì)象(通 常,這些是集合)或父關(guān)系的屬性(這通常是在集合內(nèi)完成的,并返回集合自身)。我們可以對(duì)此過(guò)程進(jìn) 行粗略的說(shuō)明:您調(diào)用一連串子屬性和父屬性(或可能調(diào)用幫助器方法)以導(dǎo)航對(duì)象樹的各個(gè)軸,直到您 檢索到包含您所查找的對(duì)象的值。

通常,您應(yīng)該可以在 XAML 中針對(duì) Silverlight 構(gòu)造您的內(nèi)容,這樣,您就不需要大量查詢樹的結(jié)構(gòu) 。為了避免需要遍歷樹,請(qǐng)?jiān)趧?chuàng)建元素的 XAML 中對(duì)于 x:Name / Name 屬性向這些元素提供一個(gè)值。這 就創(chuàng)建了一個(gè)直接引用,該引用可用于標(biāo)記從 XAML 編譯的類中,與遍歷樹相比,這種獲取對(duì)象的方法出 錯(cuò)的可能性要低得多。

此外,如果您通過(guò)代碼構(gòu)造函數(shù)而不通過(guò) XAML 加載來(lái)創(chuàng)建對(duì)象,則您應(yīng)該能夠構(gòu)造您的代碼,以便 您可以定義私有字段或變量來(lái)在運(yùn)行時(shí)保留對(duì)象引用(保留在類中,或在應(yīng)用程序級(jí)別存儲(chǔ)為變量)。

然而,在某些情況下,向?qū)ο筇峁┟Q并在范圍中保留對(duì)象引用是不可能的,也是不切實(shí)際的。一個(gè) 此類方案是:您正在添加由用戶提供或通過(guò)數(shù)據(jù)綁定提供的動(dòng)態(tài)內(nèi)容,而您無(wú)法預(yù)測(cè)所添加的項(xiàng)數(shù)或運(yùn)行 時(shí)對(duì)象樹的結(jié)構(gòu)。另一個(gè)方案是檢查對(duì)于某個(gè)控件所應(yīng)用的模板,或控件的某個(gè)組成部分。

警告說(shuō)明警告:

Silverlight 通常支持“設(shè)置外觀”概念,也稱為重新設(shè)置控件樣式或控件重新模板化。尤其是,如 果您是控件作者且正在編寫控件的支持代碼,則假定特定的樹結(jié)構(gòu)可能很危險(xiǎn)。因?yàn)榇蠖鄶?shù)控件支持可設(shè) 置的模板(無(wú)論您是否已啟用多個(gè)特定的擴(kuò)展點(diǎn),如子部分樣式),所以,運(yùn)行時(shí)可視化樹可能與通過(guò)所 應(yīng)用的默認(rèn)模板創(chuàng)建的樹不同。請(qǐng)參見通過(guò)使用 ControlTemplate 自定義現(xiàn)有控件的外觀。

用于遍歷“子項(xiàng)”和其他集合的 Try-catch 邏輯

如果您遍歷對(duì)象樹的要求涉及到查找某些對(duì)象,而這些對(duì)象所表示的集合未表示為可視化樹的一部分 ,則您可能需要編寫專用的函數(shù),以便嘗試查找與特定的命名模式或特定類的對(duì)象模型相匹配的 API。

向下(遠(yuǎn)離根)遍歷對(duì)象樹的多個(gè)級(jí)別通常是可能的,只要您了解所包含的對(duì)象將具有集合的點(diǎn)。您 可能必須使用 try/catch 方法或其他等效方法來(lái)檢測(cè)這一點(diǎn),即檢查 Children 是否存在以及 Count 是 否為非零值(此處的 Children 和 Count 是占位符,而不是文字 API;根據(jù) .NET 命名原則,Children 和 Count 剛好是這些類型的屬性的公共名稱,但根據(jù)對(duì)象及其對(duì)象模型,實(shí)際屬性可能具有不同的名稱 )。總體 Silverlight 對(duì)象模型中的某些集合包含在未命名為 Children 的屬性中。如果您知道您正在 遍歷到某個(gè)未命名為 Children 的特定集合屬性,則應(yīng)在邏輯中說(shuō)明此情況。

使用 VisualTreeHelper

VisualTreeHelper 是一個(gè)可用于遍歷對(duì)象樹的實(shí)用工具類。(可視化樹的概念已在本主題前面的“對(duì) 象樹”一節(jié)中介紹。)

因?yàn)槟梢栽谶\(yùn)行時(shí)對(duì)可視化樹執(zhí)行操作,并且可以遍歷到模板部件,所以這可能是一種可用來(lái)檢查 模板組成情況的有用手段。此外,您可以檢查可能通過(guò)數(shù)據(jù)綁定填充的子集合,或者您的應(yīng)用程序代碼可 能無(wú)法全部了解運(yùn)行時(shí)對(duì)象樹的完整本質(zhì)的子集合。為此,您可以通過(guò) GetChild 并將 GetChildrenCount 用作一個(gè)確定因素(確定樹節(jié)點(diǎn)是單個(gè)項(xiàng)還是應(yīng)按計(jì)數(shù)進(jìn)行迭代的“子項(xiàng)”集合)來(lái) 遍歷該樹。

遍歷模板內(nèi)容

除VisualTreeHelper 之外,可用來(lái)遍歷模板內(nèi)容的另一個(gè)方法是 GetTemplateChild。使用 GetTemplateChild 或遍歷模板內(nèi)容通常是必要的,因?yàn)?FindName 的行為由名稱范圍概念控制。在這種 情況下,模板內(nèi)容與對(duì)象樹的其他部分具有特意不同的名稱范圍,因?yàn)槟0迨枪蚕淼模绻徊捎脝为?dú)的 名稱范圍,則在多次應(yīng)用模板時(shí)會(huì)導(dǎo)致名稱沖突。GetTemplateChild 按其模板名稱范圍 x:Name 值查找 對(duì)象,同時(shí)從應(yīng)用該模板的特定 Control 的更大對(duì)象樹范圍中遍歷。

Silverlight 對(duì)象和 HTML DOM

還有另一個(gè)對(duì)象模型可用于為 HTML 編寫腳本:HTML 文檔對(duì)象模型 (DOM)。然而,DOM 不會(huì)將 Silverlight 插件加載的內(nèi)容標(biāo)識(shí)為 DOM 的一個(gè)完整部分。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 欧美亚洲一级 | 国产一有一级毛片视频 | 男女污污视频网站 | 天天干干| 久久精品2019中文字幕 | 精品在线观看一区二区三区 | 久久久激情网 | 成人午夜一区二区 | 国产精品啪一品二区三区粉嫩 | 宅男噜噜噜66国产免费观看 | 羞羞答答影院 | 欧美特黄一级高清免费的香蕉 | 亚洲国产一区二区三区 | 亚洲乱码精品久久久久 | 久草在线小说 | 亚洲午夜视频在线 | 草莓福利社区在线 | 久久av免费 | 久久久日韩精品一区二区三区 | 国产在线久 | 美女视频黄视大全视频免费网址 | 日韩黄在线 | 超碰97人人艹 | 国产一级www | 一本色道久久综合亚洲精品图片 | 精品一区二区在线观看视频 | 久久第四色 | 亚洲一级片免费观看 | 北京一级毛片 | 最新黄色av | 亚洲精品一区二区三区在线看 | 欧美一区2区三区4区公司二百 | 99精品视频网站 | 欧美成人高清在线 | 欧美国产精品一区二区 | 视频一区二区视频 | 精品在线观看一区 | 一级黄色免费观看视频 | 久久国产精品91 | 欧美www| 精品国产精品久久 |