WPF布局系統

WPF之路——WPF布局系統

前言

?????前段時間忙了一陣子Google Earth,這周又忙了一陣子架構師論文開題報告,現在終于有時間繼續<WPF之路>了。先回憶一下上篇的內容,在《從HelloWorld到WPF World》中,我們對WPF有了個大概的了解,并了解了初學WPF時應該從哪些知識點入手。今天我們就從最基本的知識點之一布局系統來繼續學習WPF,主要包括如下內容。


  • 0,什么是布局

  • 1,基本元素——面板

  • 2,常用容器控件

  • 3,測量與排列

  • 4,基本屬性:Alignment,Margin和Pading

  • 5,附加屬性

  • 6,布局與性能

  • 7,總結


    0,什么是布局


      這是一個很簡單的問題。簡單來說,就是把一些控件有條理的擺放在界面上合適的位置,顯然擺的亂七八糟不能算布局。在WPF中,這個條理與WinForm中略有不同,讓我們看個很簡單的界面:

    這樣子的界面大家在熟悉不過了。依圖所示,WPF先用藍線(假設的線)將界面劃分為上下兩部分,然后再有紅線劃分出多個方格,最后放入控件,其中每部分中的控件或劃分的空格只能縱向排列,或橫向排列,不能有其他選擇。大多數情況下,WPF程序界面上的控件都要按照此種遞歸的方法逐個排列,最終形成所看到的界面。

    ?

    1,基本元素——面板


      在上節中我們了解了WPF布局原理,這可以簡單理解為大控件中按排或列放入小控件,小控件在按照同樣規則放入更小控件。這種能放入其他控件的控件是WPF布局系統中的基本元素——面板。面板是用來放東西的,既包括控件元素,也包括面板自己。面板不僅能承載其他子元素(控件),還能控制子元素的大小,位置以及如何排列。例如上述例子中,藍線劃分的面板控制子元素只能上下排列,而紅線劃分的面板控制的子元素只能橫向排列。

    ?????WPF默認提供了幾種面板都是從基面板(Panel)繼承而來,看一下它們的繼承鏈。

    ?????System.Windows.Threading.DispatcherObject
    ??????? System.Windows.DependencyObject
    ????????? System.Windows.Media.Visual
    ??????????? System.Windows.UIElement
    ????????????? System.Windows.FrameworkElement

    ??????????????? System.Windows.Controls.Control
    ??????????????? System.Windows.Controls.Panel
    ????????????????? System.Windows.Controls.Canvas
    ????????????????? System.Windows.Controls.DockPanel
    ????????????????? System.Windows.Controls.Grid
    ????????????????? System.Windows.Controls.StackPanel
    ????????????????? System.Windows.Controls.VirtualizingPanel
    ????????????????? System.Windows.Controls.WrapPanel
    ?

    2,常用容器控件


    WPF默認提供了數種布局控件,常用的包括如下幾種:?

    名稱用法說明
    Canvas此面板可承載任意元素,包括控件,圖形,甚至文字。各種元素依據屏幕坐標確定位置。
    DockPanel此面板可指定元素的排列停靠方式,每個子元素的排列方式可以不同。
    Grid此面板使子元素按照縱橫網格排列。
    StackPanel此面板使子元素按照水平或垂直方向排列,兩個方向只能選其一。

    VirtualizingStackPanel

    與StackPanel相同,不同之處在于它可以使內容虛擬化。
    WrapPanel使子元素按照水平或垂直方向排列,在行或列處換行或列,依舊按照水平或垂直方向從左到右或從上到下排列。

    ?

    3,測量與排列


      當我們在面板上放入子元素,并設置相應的屬性時,WPF的布局系統自動為我們完成2個過程:測量和排列,這是兩個非常重要的過程。

      由于WPF界面元素有很多與布局有關的屬性,如坐標,大小,對齊方式,相對位置,間距等。首先這些屬性使用的是與設備無關的分辨率單元,這導致同樣大小的元素在不同界面上顯示的效果可能不同;其次每個屬性值有一定的優先級,例如Button的Height和Width屬性優先于Stretch屬性,如果設置 Height, Width 以及 Stretch,會導致 Stretch被忽略。

      因此,盡管在設計時指定了屬性值,布局系統依然需要重新計算每個子元素在界面上的實際大小,位置,邊距等值,這些值被稱為“FinalSize”。

    ?

    4,基本屬性:Alignment,Margin和Pading


      在設計UI時,WPF為我們提供了一些屬性用于精確定位元素,其中最常用的有三個:Alignment(包括水平,垂直),Margin,Pading,具體用法如下:

    名稱說明
    Alignment子元素在水平(垂直)方向的對齊方式,有左對齊,右對齊(頂端對齊,底部對齊),中間對齊,拉伸填充等四種方式。
    Margin用于指定元素與其子級或同級之間的距離,包括上下左右四個值。也可通過使用 Margin="20" 同時指定四個值。
    Pading

    Padding 在大多數方面類似于 Margin,只有少數元素有(公開),用于將子元素的有效大小增大指定的厚度。

    ?

    5,附加屬性


      通過上面我們了解到子元素通過一些屬性值的設置實現在面板上布局,比如Alignment對齊屬性,Dock停靠排列屬性。這些屬性不屬于子元素本身,而依賴與所在的父元素。比如同樣是Button,在DockPanel中有Dock屬性,而在Grid中就沒有。這些屬性的存在依賴與父元素,在WPF中稱做“附加屬性”。

      附加屬性的用途是允許不同的子元素為實際在父元素中定義的屬性指定唯一值,目的是讓子元素通知父元素它將如何在界面中呈現。如上面提到的DockPanel.Dock 屬性,因為它將在 DockPanel 中包含的元素上設置,而不是在 DockPanel 本身設置。注意,相對于子元素,父元素提供的附加屬性相當于全局屬性。

    ?

    6,布局與性能


      通過上面我們了解到,當給界面元素的布局屬性賦值時,布局系統需要重新計算和排列所有子元素的“FinalSize”(因為改變影響不可知)。這是一個遞歸的過程。如果不注意,可能會帶來性能問題。因此在設計時應注意下面幾點:

      1,應注意哪些屬性值更改會引起執行布局系統的遞歸更新;

      2,如有可能,應使用 RenderTransform 而不要使用 LayoutTransform;

      3,避免不必要地調用 UpdateLayout,因為UpdateLayout強制調用布局系統的遞歸更新;

      4,當包含大量元素集合時,請使用 VirtualizingStackPanel虛擬化元素;

    ?

    7,總結


      通過本文,我們大概了解了WPF的布局系統,常用的布局面板,與布局有關的幾個屬性,以及設計開發UI時的注意事項。這些內容很多與WinForm中的相關概念相通,可以說是舊瓶裝新酒,稍加思考,并不難理解;如果深入了解,會發現與WinForm截然不同。但作為初學者,如果能靈活使用文中所講的知識點,深入理解注意點,對自身的提高還是很有幫助的

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

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

相關文章

PostGIS容器運行

2019獨角獸企業重金招聘Python工程師標準>>> 獲取鏡像&#xff1a; docker pull mdillon/postgis 該 mdillon/postgis 鏡像提供了容器中運行Postgres&#xff08;內置安裝PostGIS 2.5&#xff09; 。該鏡像基于官方 postgres image&#xff0c;提供了多種變體&#…

小型數據庫_如果您從事“小型科學”工作,那么您是否正在利用數據存儲庫?

小型數據庫If you’re a scientist, especially one performing a lot of your research alone, you probably have more than one spreadsheet of important data that you just haven’t gotten around to writing up yet. Maybe you never will. Sitting idle on a hard dri…

BitmapEffect位圖效果是簡單的像素處理操作。它可以呈現下面幾種特殊效果。

BitmapEffect位圖效果是簡單的像素處理操作。它可以呈現下面幾種特殊效果。 BevelBitmapEffect 凹凸效果 BlurBitmapEffect 模糊效果 DropShadowBitmapEffect投影效果 EmbossBitmapEffect 浮雕效果 Outer…

AutoScaling 與函數計算結合,賦予更豐富的彈性能力

目前&#xff0c;彈性伸縮服務已經接入了負載均衡&#xff08;SLB&#xff09;、云數據庫RDS 等云產品&#xff0c;但是暫未接入 云數據庫Redis&#xff0c;有時候我們可能會需要彈性伸縮服務在擴縮容的時候自動將擴縮容涉及到的 ECS 實例私網 IP 添加到 Redis 白名單或者從 Re…

參考文獻_參考

參考文獻Recently, I am attracted by the news that Tanzania has attained lower middle income status under the World Bank’s classification, five years ahead of projection. Being curious on how they make the judgement, I take a look of the World Bank’s offi…

java語言靜態分析工具_PMD 6.16.0 發布,跨語言靜態代碼自動分析工具

PMD 6.16.0 發布了。PMD 是一個代碼分析器&#xff0c;能夠幫助發現常見的編程問題&#xff0c;比如未使用的變量、空的 catch 塊、不必要的對象創建等等。最初僅支持 Java 代碼&#xff0c;目前還可支持 JavaScript、Salesforce.com Apex 和 Visualforce、PLSQL、Apache Veloc…

B1922 [Sdoi2010]大陸爭霸 最短路

我一直都不會dij的堆優化&#xff0c;今天搞了一下。。。就是先弄一個優先隊列&#xff0c;存每個點的數據&#xff0c;然后這個題就加了一點不一樣的東西&#xff0c;每次的最短路算兩次&#xff0c;一次是自己的最短路&#xff0c;另一次是機關的最短路&#xff0c;兩者取最大…

WPF中的鼠標事件詳解

WPF中的鼠標事件詳解 Uielement和ContentElement都定義了十個以Mouse開頭的事件&#xff0c;8個以PreviewMouse開頭的事件&#xff0c;MouseMove,PreviewMouseMove,MouseEnter,Mouseleave的事件處理器類型都是MouseEventHandler類型。這些事件都具備對應得MouseEventargs對象。…

數據統計 測試方法_統計測試:了解如何為數據選擇最佳測試!

數據統計 測試方法This post is not meant for seasoned statisticians. This is geared towards data scientists and machine learning (ML) learners & practitioners, who like me, do not come from a statistical background.?他的職位是不是意味著經驗豐富的統計人…

前端介紹-35

前端介紹-35 # 前端## 一、什么是前端 前端即網站前臺部分&#xff0c;運行在PC端&#xff0c;移動端等瀏覽器上展現給用戶瀏覽的網頁。隨著互聯網技術的發展&#xff0c;HTML5&#xff0c;CSS3&#xff0c;前端框架的應用&#xff0c;跨平臺響應式網頁設計能夠適應各種屏幕…

spring的幾個通知(前置、后置、環繞、異常、最終)

1、沒有異常的 2、有異常的 1、被代理類接口Person.java 1 package com.xiaostudy;2 3 /**4 * desc 被代理類接口5 * 6 * author xiaostudy7 *8 */9 public interface Person { 10 11 public void add(); 12 public void update(); 13 public void delete();…

每個Power BI開發人員的Power Query提示

If someone asks you to define the Power Query, what should you say? If you’ve ever worked with Power BI, there is no chance that you haven’t used Power Query, even if you weren’t aware of it. Therefore, one could easily say that Power Query is the “he…

c# PDF 轉換成圖片

1.新建項目 2.新增一個新文件夾“lib”&#xff08;主要是為了存放引用的dll&#xff09; 3.將“gsdll32.dll 、PDFLibNet.dll 、PDFView.dll”3個dll添加到文件夾中 4.項目添加“PDFLibNet.dll 、PDFView.dll”2個類庫的引用&#xff0c;并將gsdll32.dll 拷貝到項目生產根…

java finally在return_Java finally語句到底是在return之前還是之后執行?

點擊上方“方志朋”&#xff0c;選擇“置頂或者星標”你的關注意義重大&#xff01;網上有很多人探討Java中異常捕獲機制try...catch...finally塊中的finally語句是不是一定會被執行&#xff1f;很多人都說不是&#xff0c;當然他們的回答是正確的&#xff0c;經過我試驗&#…

oracle 死鎖

為什么80%的碼農都做不了架構師&#xff1f;>>> ORA-01013: user requested cancel of current operation 轉載于:https://my.oschina.net/8808/blog/2994537

面試題:二叉樹的深度

題目描述&#xff1a;輸入一棵二叉樹&#xff0c;求該樹的深度。從根結點到葉結點依次經過的結點&#xff08;含根、葉結點&#xff09;形成樹的一條路徑&#xff0c;最長路徑的長度為樹的深度。 思路&#xff1a;遞歸 //遞歸 public class Solution {public int TreeDepth(Tre…

a/b測試_如何進行A / B測試?

a/b測試The idea of A/B testing is to present different content to different variants (user groups), gather their reactions and user behaviour and use the results to build product or marketing strategies in the future.A / B測試的想法是將不同的內容呈現給不同…

hibernate h2變mysql_struts2-hibernate-mysql開發案例 -解道Jdon

Hibernate專題struts2-hibernate-mysql開發案例與源碼源碼下載本案例展示使用Struts2&#xff0c;Hibernate和MySQL數據庫開發一個個人音樂管理器Web應用程序。&#xff0c;可將您的音樂收藏添加到數據庫中。功能有&#xff1a;顯示一個添加記錄的表單和所有的音樂收藏的列表。…

P5024 保衛王國

傳送門 我現在還是不明白為什么NOIPd2t3會是一道動態dp…… 首先關于動態dp可以看這里 然后這里就是把把矩陣給改一改&#xff0c;改成這個形式\[\left[dp_{i-1,0},dp_{i-1,1}\right]\times \left[\begin{matrix}\infty&ldp_{i,1}\\ldp_{i,0}&ldp_{i,1}\end{matrix}\ri…

提取圖像感興趣區域_從圖像中提取感興趣區域

提取圖像感興趣區域Welcome to the second post in this series where we talk about extracting regions of interest (ROI) from images using OpenCV and Python.歡迎來到本系列的第二篇文章&#xff0c;我們討論使用OpenCV和Python從圖像中提取感興趣區域(ROI)。 As a rec…