首页 > 其他分享 >WPF 入门笔记 - 02 - 布局综合应用

WPF 入门笔记 - 02 - 布局综合应用

时间:2023-05-28 17:45:16浏览次数:47  
标签:02 容器 元素 入门 控件 布局 设置 WPF

本篇博文对接上篇末尾处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>

标签:02,容器,元素,入门,控件,布局,设置,WPF
From: https://www.cnblogs.com/BoiledYakult/p/17438548.html

相关文章

  • 五分钟了解Redis入门安装
    一、Redis是什么二、下载简单一点直接打开GitHub,下载.mis 三、安装 一直下一步,到这里更换你想要的路径,然后勾上自动添加环境变量,就不用手动添加  安装好的目录文件 四、启动点击redis-cli.exe 这个就是默认默认的端口号 五、配置文件cmd打开配置账号密六......
  • Web Component入门
    前言在我们现在的前端开发中,组件化早已成为主流。Vue、React、Angular等前端框架都贯彻着「组件化」的概念,而这一切「组件化」都是「高内聚、低耦合」思想下的产物。就当下而言,使用这些框架也会给我们带来一系列问题,例如:一个前端团队一半的项目用的Vue技术栈,一半的项目用的React......
  • 2023上半年软考系统分析师科目一整理-02
    (2023上半年软考系统分析师科目一整理-02)1.安全对称加密算法中,由于加密解密都使用同样的密钥,所以密钥需要进行共享,故也被称共享密钥算法。三重DES加密是使用2个DES密钥,进行多次操作来完成的,所以其密钥长度是:56*2=112位。对称加密算法(私钥加密算法)包括:DES、3DES、RC-5、IDEA、......
  • 202305281631-《远程Linux服务器——安装tomcat8、jdk1.8、mysql5——mysql workerben
    bash已连接的上,但workerbench连不上,提示:1.FailedtoConnecttoMySQLat11.11.11.111:[email protected]'11.11.11.111'isnotallowedtoconnecttothisMySQLserver解决办法(为什么,我也不知道):1.登录mysql,一次执......
  • 2023冲刺国赛模拟 6.1
    为什么题目名称又是\(A,B,C\)啊!T1嘉然首先对整个序列做一些处理,容易发现连续的颜色相同的一段,我们只能取其中的一个值,贪心的讲,显然需要取这一段的最大值,那么我们将颜色相同的段缩起来,设最终得到的序列长度为\(m\),不难发现我们最多选择\(\lfloor\tfrac{m-1}{2}\rfloor\)......
  • 2023.4-2023.5 水题记录 (持续更新)
    摆烂了属于是.1.P4071[SDOI2016]排列计数错排板子,显然答案为\(\dbinom{n}{m}D_{n-m}\),\(D_k\)m为错排数.2.P5104红包发红包连续型随机变量入门题.本人不太熟练,写一下过程.根据题中条件,抽到钱数在\([0,x](x\in[0,w])\)间的概率为\(\dfrac{x}{w}\).求导得概......
  • Lightroom Classic 2022(lrc2022)中文版 win/mac
    LightroomClassic2022是Adobe公司推出的一款图像处理软件,主要用于数字照片的编辑、整理和输出。它提供了丰富的编辑工具和管理功能,可以帮助用户高效地管理和处理数千张照片。在2022年版本中,增加了新的功能,如批量编辑、智能搜索、更快的性能和改进的界面等。主要特点包括:统一的......
  • LeetCode 周赛 347(2023/05/28)二维空间上的 LIS 最长递增子序列问题
    本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]提问。往期回顾:LeetCode单周赛第346场·仅68人AK的最短路问题周赛347概览T1. 移除字符串中的尾随零(Easy)标签:模拟、字符串T2.对角线上不同值的数量差(Easy)标签:前后缀分解T3.使所有字符......
  • 2023.5.28——软件工程站立会议(阶段二)
    站立会议内容:1.整个项目预期的任务量:目前已经花的时间:剩余的时间:2.任务看板照片: 3.团队照片: 4.产品状态:最新做好的功能:正在完成中5.燃尽图:......
  • 2023.5.28——软件工程日报
    所花时间(包括上课):6h代码量(行):0行博客量(篇):1篇今天,上午学习,下午学习。我了解到的知识点:1.了解了一些数据库的知识;2.了解了一些python的知识;3.了解了一些英语知识;5.了解了一些Javaweb的知识;4.了解了一些数学建模的知识;6.了解了一些计算机网络的知识;......