WPF-10 邏輯樹和可視化樹

我們在WPF-03 資源之Resources結尾中介紹邏輯樹和可視化樹的基本概念,我們這節來介紹這兩棵樹

邏輯樹(Logical Tree)

邏輯樹是由每個控件的節點組成,本質上就是XAML文件中的UI元素,我們可以通過LogicalTreeHelper類提供的靜態方法獲取邏輯樹的對象,我們通過一個例子演示獲取整個頁面邏輯樹

7d977bcb5dd0d1d59a1fac1f39584e24.png

<Window x:Class="Example_10.RepresentLogicalTree"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:Example_10" mc:Ignorable="d" Title="RepresentLogicalTree" Height="450" Width="800"><Grid><Grid.RowDefinitions><RowDefinition Height="0.15*"></RowDefinition><RowDefinition></RowDefinition></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition></ColumnDefinition></Grid.ColumnDefinitions><StackPanel Grid.Row="0" Grid.Column="0" Orientation="Horizontal"><Button Name="btnLogical" Height="30" Click="btnClick_Click">展示邏輯樹</Button><Label VerticalAlignment="Center" Margin="200,0,0,0">Label 控件</Label></StackPanel><StackPanel><TreeView Name="logicalTree"></TreeView></StackPanel></Grid>
</Window>
public partial class RepresentLogicalTree : Window{public RepresentLogicalTree(){InitializeComponent();}private void btnClick_Click(object sender, RoutedEventArgs e){logicalTree.Items.Add(GetLogicTree(this));}public static TreeViewItem GetLogicTree(DependencyObject obj){if (obj == null){return null;}TreeViewItem treeNode = new TreeViewItem { Header = obj.GetType().FullName, IsExpanded = true };foreach (var child in LogicalTreeHelper.GetChildren(obj)){var item = GetLogicTree(child as DependencyObject);if (item != null){treeNode.Items.Add(item);}}return treeNode;}}

我們可以很清晰的看到整個邏輯樹節點對應到XAML頁面中的元素

可視化樹(Visual Tree)

可視化樹是邏輯樹的一種擴展,邏輯樹的每個結點都被分解為核心視覺組件,邏輯樹節點對我們來說是個黑箱,而視覺樹暴露了視覺的實現細節,我們可以通過VisualTreeHelper類提供的靜態方法獲取可視化樹節點,可視化樹要比邏輯樹呈現的粒度更細,XAML結構和上面結構相同,我們來呈現可視化樹結構:

6a656d8b7f68279693a2fe86f92ecdc7.png

public partial class RepresentVisualTree : Window{public RepresentVisualTree(){InitializeComponent();}private void btnVisual_Click(object sender, RoutedEventArgs e){VisualTree.Items.Add(GetVisualTree(this));}public static TreeViewItem GetVisualTree(DependencyObject obj){if (obj == null){return null;}TreeViewItem?treeNode?=?new?TreeViewItem?{?Header?=?obj.GetType().FullName,?IsExpanded?=?true?};for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++){var child = VisualTreeHelper.GetChild(obj, i);var item = GetVisualTree(child);if (item != null){treeNode.Items.Add(item);}}return treeNode;}}

從上面的例子我們可以看到更細粒度的控件組成部件,下圖展示了整個視覺圖的組成,綠色表示可視化樹,紅色表示邏輯樹,可視化樹范圍包含邏輯樹

14b6d010e6ee00d78c74c05206c5295a.png

這節我們主要了解WPF中邏輯樹和可視化樹,通過本節希望能夠加深對WPF中控件組成的部件的了解

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281867.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281867.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281867.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

洛谷P4364 [九省聯考2018]IIIDX(線段樹)

傳送門 題解看得……很……迷&#xff1f; 因為取完一個數后&#xff0c;它的子樹中只能取權值小于等于它的數。我們先把權值從大到小排序&#xff0c;然后記$a_i$為他左邊&#xff08;包括自己&#xff09;所有取完他還能取的數的個數。那么當取完一個點$x$的數之后&#xff0…

國產車崛起粉碎德日工業神話

由于二戰戰敗&#xff0c;德國一大批頂尖人才被美蘇瓜分&#xff0c;戰敗國地位和人才斷層導致德國工業基本是第二次工業革命的產物&#xff0c;專精于機械、化工等傳統行業&#xff0c;并有巴斯夫、拜爾、大眾、戴姆勒、寶馬等一批世界級企業。不過&#xff0c;德國世界級的IT…

java hibernate 分頁查詢_4 Hibernate HQL查詢,分頁查詢

/*** HQL查詢的一個例子*/public static void hql(){Session s null;try{s HibernateUtil.getSeesion();//final String hql "from User as u where u.name?";final String hql "from User as u where u.name:name";final Query query s.createQuery…

Linux -sed

sed &#xff0c;查找sed -n /root/p passwd #列出passwd中有root的行 sed -nr /ot/p passwd #sed -r grep -E 都是進行脫意 sed -nr /0{2}/p passwd #匹配兩次o的 sed -nr /root|bus/p passwd #匹配root 或者bus的 sed -n 2p passwd # 查找指定的行sed -n 2,5p passwd # 查找…

h5 端圖片上傳-模擬多張上傳

1、由于后端的限制&#xff0c;上傳圖片到服務器只能的一張一張傳2、顯示圖片預覽是本地的圖片3、根據服務器返回的結果拿到相應的路徑保存到提交評論的接口中4、刪除的時候&#xff0c;需要刪除對應的路徑&#xff0c;不要把刪除的提交到評論的接口中 A、comment-detail.js va…

node安裝問題

1.最好安裝到默認路徑&#xff0c;手賤安到了D盤&#xff0c;升級npm各種出錯。 明明升級成功&#xff0c;查看版本時&#xff0c;確顯示依然是老的版本。 原因&#xff1a;升級的是C盤的node_modules中的npm&#xff0c;執行時確是D盤node自帶的npm&#xff0c;不知道為啥。。…

全新升級的AOP框架Dora.Interception[匯總,共6篇]

多年之前利用IL Emit寫了一個名為Dora.Interception的AOP框架。前幾天利用Roslyn的Source Generator對自己為公司寫的一個GraphQL框架進行改造&#xff0c;性能得到顯著的提高&#xff0c;覺得類似的機制同樣可以用在AOP框架上&#xff0c;實驗證明這樣的實現方式不僅僅極大地改…

java string轉decimal_java中string轉bigdecimal的例子

小編知道在java中數據類型非常 的嚴格了&#xff0c;我們如果一個地方不小心就會導致應用出問題了&#xff0c;今天 小編就在string 轉BigDecimal上碰到了一些問題&#xff0c;下面整理了幾個例子大家一起來看看。例子1,string 轉BigDecimalpublic class Test{public static vo…

通過url來設置log4j的記錄級別

2019獨角獸企業重金招聘Python工程師標準>>> 直接看代碼。 import org.apache.log4j.AppenderSkeleton; import org.apache.log4j.Level; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotati…

通過用戶模型,對數據庫進行增刪改查操作

增加&#xff1a;user db.session.add(user)db.session.commit() #增加 user User(username JACKSON,password0328 ) db.session.add(user) db.session.commit() 查詢&#xff1a;User.query.filter(User.username mis1114).first() #查詢 userUser.query.filter(User.usern…

Android OpenGL ES(七)----理解紋理與紋理過濾

1.理解紋理 OpenGL中的紋理能夠用來表示圖像。照片&#xff0c;甚至由一個數學算法生成的分形數據。每一個二維的紋理都由很多小的紋理元素組成。它們是小塊的數據&#xff0c;類似于我們前面討論過的片段和像素。要使用紋理&#xff0c;最經常使用的方式是直接從一個圖像文件載…

WPF 基礎控件之托盤

WPF 基礎控件之托盤控件名&#xff1a;NotifyIcon作者&#xff1a; WPFDevelopersOrg - 吳鋒|驚鏵原文鏈接&#xff1a; https://github.com/WPFDevelopersOrg/WPFDevelopers框架使用大于等于.NET40。Visual Studio 2022。項目使用 MIT 開源許可協議。新建NotifyIcon自定義…

java 匿名 異常_JAVA類(內部類、匿名內部類、異常、自定義異常)

內部類package AA;public class類 {int de123;StringBuffer deenewStringBuffer();public class成員內部類{public voidff() {System.out.println("這是成員內部類方法");}}/*1.可以訪問外部類所有的成員&#xff0c;包括被聲明為私有(private)的&#xff1b;2.可以使…

ASP.NET 多環境下配置文件web.config的靈活配置---轉

注意&#xff1a;本功能在.Net Core中已經不可用&#xff0c;暫時需手動修改web.config中的信息&#xff0c;或者將其設置在appsettings.XXX.json中&#xff0c;然后再使用web.config中的環境變量來制定使用的具體appsettings文件。 轉自&#xff1a;https://www.cnblogs.com/h…

英語之各類人群

工作狂&#xff1a;workaholic 月光族&#xff1a;moonlight group 電燈泡&#xff1a;third wheel 菜鳥&#xff1a;newbie 夜貓子&#xff1a;night owl 路癡&#xff1a;somebody has no sense of derection 宅男宅女&#xff1a;homebody 時尚的潮人&#xff1a;trend sett…

Wget CVE-2014-4877:FTP 符號鏈接任意文件系統訪問

Wget 爆出 CVE-2014-4877 漏洞&#xff1a;FTP 符號鏈接任意文件系統訪問。 Package: wgetVersion: 1.15-1Severity: important Upstream fix&#xff1a; http://git.savannah.gnu.org/cgit/wget.git/commit/?id18b0979357ed7dc4e11d4f2b1d7e0f5932d82aa7 References&#xf…

JavaScript 學習提升

javascript 技能提升 理解閉包 閉包&#xff0c;官方對閉包的解釋是&#xff1a;一個擁有許多變量和綁定了這些變量的環境的表達式&#xff08;通常是一個函數&#xff09;&#xff0c;因而這些變量也是該表達式的一部分。閉包的特點&#xff1a;1. 作為一個函數變量的一個引用…

Uranium UI Kit

Uranium UI Kit控件名&#xff1a;Uranium UI Ki作者&#xff1a;enisn原文鏈接&#xff1a; https://github.com/enisn/UraniumUI項目使用 Apache-2.0 開源許可協議。Uranium 是用于 .NET MAUI 的免費和開源 UI 工具包。它提供了一組控件和實用程序來構建現代應用程序。它建…

數據庫監控框架 oneproxy-monitor 開源了

OneProxy-Monitor 是數據庫監控的框架&#xff0c;通過這個框架可以快速的開發出一款數據庫的監控軟件。目前已經在這個框架下面開發出來了sql server的監控軟件oneproxy-for-sqlserver&#xff0c; postgresql的監控軟件oneproxy-for-postgresql。并且還可以作為協議成的調試軟…

java nio epoll_Java NIO 選擇器(Selector)的內部實現(poll epoll)

http://blog.csdn.net/hsuxu/article/details/9876983之前強調這么多關于linux內核的poll及epoll&#xff0c;無非是想讓大家先有個認識&#xff1a;Java NIO中的選擇器依賴操作系統內核的這些系統調用&#xff0c;我們這里只講解與linux內核相關的NIO實現&#xff0c;當然&…