WPF 入門筆記 - 02 - 佈局綜合應用

来源:https://www.cnblogs.com/BoiledYakult/archive/2023/05/28/17438548.html
-Advertisement-
Play Games

本篇博文對接上篇末尾處WPF常用佈局控制項的綜合應用,為[痕跡g](https://www.cnblogs.com/zh7791/p/11369020.html)佈局控制項介紹課後作業的一種思路方法。 ...


本篇博文對接上篇末尾處WPF常用佈局控制項的綜合應用,為痕跡g佈局控制項介紹課後作業的一個思路方法。

前言

首先來談一談佈局原則:

WPF視窗只能包含一個元素(Window元素屬於內容控制項,內容控制項只允許有一個子元素),所以我們得在視窗中放置一個容器,才能使我們的視窗放置更多的內容。

所以在WPF中,佈局由容器決定,使用容器佈局需要註意以下幾點:

  • 不要顯示設置元素的尺寸:可以通過設置最大和最小尺寸來限定範圍。
  • 不要使用屏幕坐標來指定元素位置:根據元素在那種容器中,來合理安排元素的位置。如需要元素之間留白,可以使用Margin設置邊距。
  • 可以嵌套佈局容器:新建WPF程式會預設提供一個Grid容器,但是我們仍可在Grid中添加容器來安排我們的佈局。

一般的佈局流程可以概括為以下幾步:

  1. 確定佈局需求:根據UI設計和功能需求,確定所需的佈局方式和控制項組織結構。
  2. 選擇合適的佈局容器:根據佈局需求選擇適合的佈局容器,如GridStackPanelWrapPanel等。
  3. 設置佈局屬性:使用佈局屬性控制控制項在容器中的位置、大小、對齊方式等。
  4. 嵌套佈局容器:根據需要,嵌套多個佈局容器以實現複雜的佈局效果。
  5. 調試和優化佈局:使用佈局調試工具,如佈局邊框和佈局分隔器,對佈局進行調試和優化,確保佈局效果符合預期。

常用佈局面板回顧:

Name Description
Grid 根據一個不可見的表格在行和列中安排元素,最靈活容器之一。
StackPanel 在水平或垂直的堆棧中放置元素,多用於複雜視窗中的一些小區域。
WrapPanel 自適應款高度並自動換行
DockPanel 根據容器的整個邊界調整元素
Uniform Grid 簡化版,強制所有單元格具有相同尺寸。
Canvas 最基本的面板,只是一個存儲控制項的容器,使用固定的坐標絕對定位元素

常用佈局屬性:

Property Description
HorizontalAlignment 用於設置子元素在容器中的水平位置 - Center、Left、Right、Stretch
VerticalAlignment 用於設置子元素在容器中的垂直位置 - Center、Top、Bottom、Stretch
Margin 用於指定元素與其父級或同級之間的距離 - 4個方向的邊距(左、上、右、下)使用,可以同時設置4個相同邊距、也可以單獨設置每條邊的邊距
Padding 用於指定元素與其子級之間的距離 - 4個方向的邊距(左、上、右、下)使用,可以同時設置4個相同邊距、也可以單獨設置每條邊的邊距

佈局詳解

作業頁面佈局如下:

image-20230528165359504

大致上可以劃分為圖示中的兩行一列的佈局,然後再細化(這裡為了方便查看,我把表格線顯示了出來):

<Window x:Class="HELLOWPF.MainWindow"
        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:HELLOWPF"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid ShowGridLines="True">
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="8*"/>
        </Grid.RowDefinitions>

        <Border Background="AntiqueWhite"/>

        <Grid Grid.Row="1" ShowGridLines="True">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="4*"/>
                <ColumnDefinition Width="6*"/>
            </Grid.ColumnDefinitions>
        </Grid>
    </Grid>
</Window>

image-20230528165953035

然後完成子元素的佈局,左邊是個四行兩列的佈局:

image-20230528170114564
<Grid Grid.Column="0" ShowGridLines="True">
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
        <RowDefinition/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>

    <Border Margin="10" Background="#219afd"/>
    <Border Margin="10" Background="#61b721" Grid.Row="0" Grid.Column="1"/>
    <Border Margin="10" Background="AntiqueWhite" Grid.Row="1" Grid.ColumnSpan="2"/>
    <Border Margin="10" Background="AntiqueWhite" Grid.Row="2" Grid.Column="0"/>
    <Border Margin="10" Background="AntiqueWhite" Grid.Row="2" Grid.Column="1"/>
    <Border Margin="10" Background="AntiqueWhite" Grid.Row="3" Grid.Column="0"/>
    <Border Margin="10" Background="AntiqueWhite" Grid.Row="3" Grid.Column="1"/>
</Grid>

image-20230528170916911

右邊是個四行三列的佈局,也可以通過設置行高的比例設計為三行三列的佈局:

image-20230528171032666
<Grid Grid.Row="1" Grid.Column="1" ShowGridLines="True">
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="2*"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>

    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>
    <Border Margin="10" Background="#ffa000"/>
    <Border Margin="10" Background="#30b8c4" Grid.Column="1"/>
    <Border Margin="10" Background="#e87a6e" Grid.Column="2"/>
    <Border Margin="10" Background="AntiqueWhite" Grid.Row="1" Grid.ColumnSpan="3"/>
    <Border Margin="10" Background="AntiqueWhite" Grid.Row="2" Grid.Column="0"/>
    <Border Margin="10" Background="AntiqueWhite" Grid.Row="2" Grid.Column="1"/>
    <Border Margin="10" Background="AntiqueWhite" Grid.Row="2" Grid.Column="2"/>
</Grid>

這樣就初步完成了這個頁面的佈局:

image-20230528171937657

<Window x:Class="HELLOWPF.MainWindow"
        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:HELLOWPF"
        mc:Ignorable="d"
        Title="MainWindow" Height="600" Width="900">
    <Grid ShowGridLines="True">
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="8*"/>
        </Grid.RowDefinitions>

        <Border Background="AntiqueWhite"/>

        <Grid Grid.Row="1" ShowGridLines="True">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="4*"/>
                <ColumnDefinition Width="6*"/>
            </Grid.ColumnDefinitions>

            <Grid Grid.Column="0" ShowGridLines="True">
                <Grid.RowDefinitions>
                    <RowDefinition/>
                    <RowDefinition/>
                    <RowDefinition/>
                    <RowDefinition/>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>

                <Border Margin="10" Background="#219afd"/>
                <Border Margin="10" Background="#61b721" Grid.Row="0" Grid.Column="1"/>
                <Border Margin="10" Background="AntiqueWhite" Grid.Row="1" Grid.ColumnSpan="2"/>
                <Border Margin="10" Background="AntiqueWhite" Grid.Row="2" Grid.Column="0"/>
                <Border Margin="10" Background="AntiqueWhite" Grid.Row="2" Grid.Column="1"/>
                <Border Margin="10" Background="AntiqueWhite" Grid.Row="3" Grid.Column="0"/>
                <Border Margin="10" Background="AntiqueWhite" Grid.Row="3" Grid.Column="1"/>
                
            </Grid>
            <Grid Grid.Row="1" Grid.Column="1" ShowGridLines="True">
                <Grid.RowDefinitions>
                    <RowDefinition Height="*"/>
                    <RowDefinition Height="2*"/>
                    <RowDefinition Height="*"/>
                </Grid.RowDefinitions>

                <Grid.ColumnDefinitions>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
                <Border Margin="10" Background="#ffa000"/>
                <Border Margin="10" Background="#30b8c4" Grid.Column="1"/>
                <Border Margin="10" Background="#e87a6e" Grid.Column="2"/>
                <Border Margin="10" Background="AntiqueWhite" Grid.Row="1" Grid.ColumnSpan="3"/>
                <Border Margin="10" Background="AntiqueWhite" Grid.Row="2" Grid.Column="0"/>
                <Border Margin="10" Background="AntiqueWhite" Grid.Row="2" Grid.Column="1"/>
                <Border Margin="10" Background="AntiqueWhite" Grid.Row="2" Grid.Column="2"/>
            </Grid>
        </Grid>       
    </Grid>
</Window>


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 訓練內容:2023江西省賽VP 賽後總結: 比賽過程: 做了簽到以後純純開始坐牢...... 策略失誤: I題被定位成簽到題也過了十四個人,但是後續沒有花更多的時間去看,一直在鑽“如何存儲圖上路徑”的牛角尖,沒有往“存在巧妙解法”這個角度思考。另外寫dfs的假解法的過程中發現對vector的基本刪除 ...
  • 操作系統 :CentOS 7.6_x64 FreeSWITCH版本 :1.10.9 日常開發過程中會遇到需要擴展FreeSWITCH對接其它系統的情況,這裡記錄下編寫FreeSWITCH自定義endpoint的過程。 一、模塊定義函數 使用FreeSWITCH自帶的框架來定義模塊函數,函數指針及參數 ...
  • # 1.初識字元串 字元串就是一系列字元。在python中,用引號括起來文本內容的都是字元串。 其語法格式為:‘文本內容’或者“文本內容” 我們發現其中的引號可以是單引號,也可以是雙引號。這樣的靈活性可以使我們進行引號之間的嵌套。 編寫程式如下所示: ![image](https://img2023 ...
  • # Rust Web 全棧開發之自建TCP、HTTP Server ## 課程簡介 ### 預備知識 - Rust 編程語言入門 - https://www.bilibili.com/video/BV1hp4y1k7SV ### 課程主要內容 - WebService - 伺服器端Web App - ...
  • 該模塊提供將二進位數據編碼為可列印ASCII字元並將這種編碼解碼回二進位數據的功能。它為[RFC 3548](https://tools.ietf.org/html/rfc3548.html)中指定的編碼提供編碼和解碼功能。定義了Base16、Base32和Base64演算法,以及事實上的標準Asci ...
  • # 關於STL容器的簡單總結 ## 1、結構體中重載運算符的示例 ``` //結構體小於符號的重載 struct buf { int a,b; bool operator queuea; //定義 a.push(x); //壓入 a.pop(); //彈出 a.size(); //取大小 a.fro ...
  • ### 超聲波模塊介紹 超聲波測距原理很簡單: 1、通過記錄發送超聲波的時間、記錄超聲波返回的時間,返回時間與發送時間相減得到超聲波的持續時間。 2、通過公式:(**超聲波持續時間** * **聲波速度**) / **2**就可以得出距離; ![image.png](https://img2023. ...
  • # Unity Undo詳解 在Unity中,Undo是一個非常重要的功能,它可以讓開發者在編輯器中進行操作時,隨時撤銷之前的操作,從而避免不必要的錯誤。本文將詳細介紹Unity Undo實現原理和使用方法,並提供多個使用例子,幫助開發者更好地理解和應用該功能。 ## 實現原理Unity Undo的 ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...