【WPF】桌面程序开发之xaml页面基础布局方式详解

使用Visual Studio开发工具,我们可以编写在Windows系统上运行的桌面应用程序。其中,WPF(Windows Presentation Foundation)项目是一种常见的选择。然而,对于初学者来说,WPF项目中xaml页面的布局设计可能是一个难点。下面,将简要介绍WPF项目中xaml页面的基础布局知识。

文章目录

  • 页面布局
  • 网格布局
    • Grid
  • 层叠布局
    • Grid
  • 内联布局
    • WrapPanel
  • 块布局
    • StackPanel
  • 弹性布局
    • DockPanel
  • 一些控件
    • Border

如果还不知道怎么创建WPF项目, 可以看以下文章,回顾一下再来

Windows系统桌面应用程序编程开发新手入门-打造自己的小工具

学过web前端页面设计的同学应该很熟悉,等看完这篇文章,相信你很快就会掌握了。

页面布局

首先看看页面布局文件,带后缀名xaml的是页面布局文件,内容如下

<Window x:Class="WpfApp4.MainWindow"
        ...
        xmlns:local="clr-namespace:WpfApp4"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <!-- 这里开始添加控件布局 -->
    </Grid>
</Window>

其中xmlns:local="clr-namespace:WpfApp4"是指定本地可用控件local的命令空间

接下来讲一讲通常用到的布局容器控件,这些控件下是可以有多个子控件的

网格布局

从上面的页面可以看到,常用的是Grid控件,如何使用它呢

Grid

这个控件<Grid>是网格面板,可以将所有子控件按行和列数进行布局。

往里面添加的一些控件,默认是放在第一个格子位置上,通过设置它的列数和行数来确定子控件的位置,内容如下

<Grid>
	<Grid.RowDefinitions>
	   <RowDefinition></RowDefinition>
	</Grid.RowDefinitions>
	<Grid.ColumnDefinitions>
	    <ColumnDefinition></ColumnDefinition>
	    <ColumnDefinition></ColumnDefinition>
	    <ColumnDefinition></ColumnDefinition>
	    <ColumnDefinition></ColumnDefinition>
	</Grid.ColumnDefinitions>
     <Button Content="Hello zs1028" Grid.Row="0" Grid.Column="0" />
     <Button Content="Hello zs1028" Grid.Column="1" />
     <Button Content="Hello zs1028" Grid.Column="2" />
     <Button Content="Hello zs1028" Grid.Column="3" />
     <Button Content="Hello zs1028" Grid.Column="4" />
     <Button Content="Hello zs1028" Grid.Column="5" />
 </Grid>

其中 Grid.Row="0" Grid.Column="0"是决定网格位置的,可不设置,因为默认均是0

显示效果如下图
在这里插入图片描述

若要限制网格为2行,需要在</RowDefinition>标签后面再加一行,

<RowDefinition></RowDefinition>

继续添加子控件,设置Grid.Row="1" 即可放置在第二行

若要进一步限制其中的列宽,就设置一个属性,内容如下

<ColumnDefinition Width="100"></ColumnDefinition>

层叠布局

在网格布局中,所有子控件不设置行列数就是默认都在第一个网格,是可以层叠存放的,

Grid

用网格布局就行,它可以实现层叠布局

<Grid>
    <Button Content="No.1 zs1028" HorizontalAlignment="Center" VerticalAlignment="Center" />
    <Button Content="No.2 zs1028" HorizontalAlignment="Center" VerticalAlignment="Top" />
    <Button Content="No.3 zs1028" HorizontalAlignment="Center" VerticalAlignment="Bottom" />
    <Button Content="No.4 zs1028" HorizontalAlignment="Left" VerticalAlignment="Center" />
    <Button Content="No.5 zs1028" HorizontalAlignment="Right" VerticalAlignment="Center" />
    <Button Content="No.6 zs1028" HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>

显示效果如下图
在这里插入图片描述
避免子控件被上下层控件覆盖至看不见,需要设置属性:

通过其HorizontalAlignmentVerticalAlignment属性来控制子控件如何选择上下左右居中放置,
还有个选择值为Stretch,不常用,它表示往水平或者垂直方向填充;

内联布局

也是在静态布局中的说法,所有子控件都是内联控件,要设置宽高,

若不设置的子控件会由系统默认自动调整最小宽高

WrapPanel

这个控件WrapPanel是自动换行面板,可以将所有子控件按顺序排列,从左到右,当空间宽度不足存放时,剩下的子控件才会自动换行放置在下面。

<WrapPanel>
    <Button Content="Hello zs1028" />
    <Button Content="Hello zs1028" />
    <Button Content="Hello zs1028" />
    <Button Content="Hello zs1028" />
    <Button Content="Hello zs1028" />
    <Button Content="Hello zs1028" />
</WrapPanel>

显示效果如下图
在这里插入图片描述

块布局

也是在静态布局中的说法,所有子控件都是块控件,占用整行或者整列,

StackPanel

这个控件</StackPanel>是堆栈面板,可以将控件按顺序垂直或水平排列, 是一种常用来布局的面板,

它可以在单个方向(水平或垂直)上排列其子元素,

设置属性Orientation值有:

  • Horizontal 水平
  • Vertical 垂直

往里面添加的一些控件是堆起来放的,内容如下

<StackPanel Background="Gray">
   <Button Content="Hello zs1028" />
	<Button Content="Hello zs1028" />
	<Button Content="Hello zs1028" />
	<Button Content="Hello zs1028" />
	<Button Content="Hello zs1028" />
	<Button Content="Hello zs1028" />
</StackPanel>

可设置属性Margin=”10,5“的边距来调整控件距离父级控件和相邻控件的位置

默认占整行,显示效果如下图
在这里插入图片描述

将属性改成Orientation="Horizontal",会占整列,显示效果如下
在这里插入图片描述

这里与之前的控件WrapPanel不同的是,它是不会自动换行,超出的部分会被遮挡

弹性布局

DockPanel

这个控件<DockPanel>是停靠用的面板,可以将所有子控件停靠在面板的四个边缘,

需要决定布局方向,通过属性DockPanel.Dock可设置子控件在上下左右方向布局,

属性DockPanel.Dock决定子控件的布局位置,其值有

  • Top
  • Left
  • Right
  • Bottom

DockPanel.Dock="Top" 决定布局位置在上边,内容如下

<DockPanel Margin="0,0,0,0">
    <DockPanel DockPanel.Dock="Top">
        <TextBlock Text="Hello zs1028" />
    </DockPanel>
    <StackPanel Background="Gray">
        <Label Content="填充区域" />
    </StackPanel>
</DockPanel>

如果第一个控件设置了Top或者Buttom,父控件会将所有子控件按照上下(垂直)方向布局;
如果设置了Left或者Right,那就是按照左右(水平)方向布局;

显示效果如下
在这里插入图片描述

最后一个控件大小是不受控制的,因为这会填充剩余空间

如果不想被用来填充,就设置父控件LastChildFill="False",内容如下

<DockPanel Margin="0,0,0,0" LastChildFill="False">
	<DockPanel DockPanel.Dock="Top">
        <TextBlock Text="Hello zs1028" />
    </DockPanel>
	<StackPanel Background="Gray">
        <Label Content="填充区域" />
    </StackPanel>
</DockPanel>

显示效果图如下
在这里插入图片描述

可发现,如果布局方向是垂直的,它只给填充了高度

果然填充的都是最后一个控件,

那如果要填充第一个控件,应该怎么办呢,内容如下

<DockPanel Margin="0,0,0,0">
	<DockPanel DockPanel.Dock="Bottom">
        <TextBlock Text="Hello zs1028" />
    </DockPanel>
	<StackPanel Background="Gray">
        <Label Content="填充区域" />
    </StackPanel>
</DockPanel>

效果图如下
在这里插入图片描述

没错吧,看布局方向,只要设置DockPanel.Dock="Bottom",它就会放到下边,

布局规律不变,最后的子控件,可在父控件里的最上边填充

一些控件

还有一些控件,都只能有一个子控件,多个子控件它是会报错误的,要注意区分,

Border

这个控件,可以给子控件添加边框的效果,

修改边框控件的属性,内容如下

<Grid Margin="0,0,0,0">
    <Border Width="100" Height="50" BorderThickness="2" BorderBrush="Blue" CornerRadius="10">
        <TextBlock Text="Hello zs1028" />
    </Border>
</Grid>

边框的属性如下:

  • BorderThickness=“2” 宽度
  • BorderBrush=“Blue” 颜色
  • CornerRadius=“10”` 圆角

还可以设置边框的属性Padding="10",添加内边距

就写到这里吧,其它控件不是很常用,这里就不多讲,如果有需要,请查阅官网文档XAML布局自行研究。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/781201.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL8.0在windows下的下载安装及详细使用

下载mysql8.0二进制包 下载地址&#xff1a;MySQL :: Download MySQL Community Server 编辑my.ini配置文件 解压二进制包&#xff0c;新建/编辑my.ini配置文件(如果不存在则新建) [client] #客户端设置&#xff0c;即客户端默认的连接参数 # 设置mysql客户端连接服务端时…

Python【打包exe文件两步到位】

Python打包Exe 安装 pyinstaller&#xff08;pip install pyinstaller&#xff09; 执行打包命令&#xff08;pyinstaller demo.py&#xff09; 打完包会生成 dist 文件夹&#xff0c;如下如

openrestry中的hello world

目录 概述实践部署openrestry脚本效果验证 概述 此篇将在 k8s 运行起一个 openrestry   环境&#xff1a;k8s&#xff1a;1.27.9 &#xff0c;openrestry(docker镜像版本)&#xff1a; 1.25.x &#xff0c;k8s 与 ingress 请参考我的其它文章 离线镜像包请参考&#xff1a;op…

2024暑假集训

Day1——枚举 Day2——测试 Day3——贪心 Day4、5——测试 ——————————————————————————————————————————— Day3T7&Day5T7:没思路 Day3T8:不知道怎么排序筛选 Day5T5:没有算法难度&#xff0c;但是不知道怎么处理2队奶牛的情…

【TB作品】51单片机 Proteus仿真 超声波LCD1602ADC0832 身高体重测量仪

00024 超声波LCD1602ADC0832 实验报告&#xff1a;基于51单片机的身高体重测量仪设计 背景介绍 本实验设计并实现了一个基于51单片机的身高体重测量仪。该系统利用超声波传感器测量高度&#xff0c;通过ADC0832模数转换芯片获取重量数据&#xff0c;并使用LCD1602显示屏显示…

MySQL 中的 DDL、DML、DQL 和 DCL

文章目录 1. 数据定义语言&#xff08;DDL&#xff09;2. 数据操作语言&#xff08;DML&#xff09;3. 数据查询语言&#xff08;DQL&#xff09;4. 数据控制语言&#xff08;DCL&#xff09;总结 在 MySQL 数据库管理系统中&#xff0c;SQL 语句可以根据其功能分为不同的类别&…

电源纹波相关

什么是纹波&#xff1f;什么是噪声&#xff1f; 这种叠加在直流稳定量上的交流分量就称为纹波。 纹波的危害 电源纹波能影响设备性能和稳定性 纹波会导致电器上产生谐波&#xff0c;降低电源的使用效率&#xff1b; 高频电源纹波可能会产生浪涌电压或电流&#xff0c;影响设…

VSCode神仙插件——CodeSnap (好看的代码截图)

1 安装 2 使用 选中要截图的代码,右键 此时右侧会出现代码截图的预览图 如果要将截图保存到本地,则点击上图红色框中的图标 也可以点击下面截的图,CtrlC复制,然后就可以CtrlV粘贴到其他应用程序里了

拉曼光谱入门:3.拉曼光谱的特征参数与定量定性分析策略

1.特征参数 1.1 退偏振率 退偏振率&#xff08;p&#xff09;是一个衡量拉曼散射光偏振状态的参数&#xff0c;它描述了拉曼散射光的偏振方向与入射光偏振方向之间的关系。退偏振率定义为垂直偏振方向的拉曼散射强度与平行偏振方向的拉曼散射强度之比。退偏振率&#xff08;p&…

shark云原生-日志体系-filebeat高级配置(适用于生产)-更新中

文章目录 1. filebeat.inputs 静态日志收集器2. filebeat.autodiscover 自动发现2.1. autodiscover 和 inputs2.2. 如何配置生效2.3. Providers 提供者2.4. Providers kubernetes2.5. 配置 templates2.5.1. kubernetes 自动发现事件中的变量字段2.5.2 配置 templates 2.6. 基于…

微信小程序简历Demo

微信小程序简历Demo 使用介绍最后获取源码 bilibili视频介绍 使用介绍 使用微信小程序实现的一个简历实现Demo 拖动马里奥&#xff0c;到指定Name下方 向上顶就可以显示对应的简历样式 点击头像可拨打电话 点击信息处可显示当前位置 最后 这是一个简单并且有趣的微信小程…

el-table 树形数据与懒加载 二级数据不展示

返回的数据中 children和hasChildren只能有一个&#xff0c;不能同时存在&#xff0c;否则加载数据会失败

端口被占用,使用小黑框查杀

netstat -ano &#xff08;查看目前所有被占的端口&#xff09; netstat -ano|findstr " 8080" 查一下目前被占用的端口号 &#xff0c;目前我要查的端口号是&#xff1a;8080&#xff0c;注意 后面打8080的时候&#xff0c;要有空格&#xff0c;要不然报错 **task…

【React Native优质开源项目】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

17_VGG深度学习图像分类算法

1.1 简介 VGG网络&#xff0c;全称为Visual Geometry Group网络&#xff0c;是由牛津大学的Visual Geometry Group和谷歌DeepMind的研究人员共同提出的深度卷积神经网络模型。这一模型因在2014年ILSVRC&#xff08;ImageNet大规模视觉识别挑战赛&#xff09;中取得图像分类任务…

高级计算机体系结构--期末真题及题型总结

2024 年春季学期期末考题回顾一、名词解释二、简答题2007 年简答题2008 年简答题简答题答案 三、分析题1. MESI 和 Dragon 协议计算给定内存存取序列所需的时钟周期2007年第一题及参考答案例题及解答 2. 顺序一致性存储模型&#xff0c;判断进程的合法输出2007年第二题及参考答…

【网站推荐】Developer Roadmaps 开发者学习路线

你是否想学习某门技术而苦苦找不到学习路线。本文推荐一个网站&#xff0c;解决学习路径问题。 roadmap.sh 旨在创建路线图、指南和其他教育内容&#xff0c;以帮助指导开发人员选择路径并指导他们的学习。 技术路线包括了前端后端安卓iosUI设计等内容&#xff0c;一些技术比如…

CV- 人工智能-深度学习基础知识

一, 深度学习基础知识 1,什么是深度学习?机器学习是实现人工智能的一种途径,深度学习是机器学习的一个子集,也就是说深度学习是实现机器学习的一种方法。2, 传统机器学习算术依赖人工设计特征,并进行特征提取,而深度学习方法不需要人工,而是依赖算法自动提取特征。深度…

【网络安全】实验四(网络扫描工具的使用)

一、本次实验的实验目的 &#xff08;1&#xff09;掌握使用端口扫描器的技术&#xff0c;了解端口扫描器的原理 &#xff08;2&#xff09;会用Wireshark捕获数据包&#xff0c;并对捕获的数据包进行简单的分析 二、搭配环境 打开两台虚拟机&#xff0c;并参照下图&#xff…

sublime 3 背景和字体颜色修改

sublime 4 突然抽风&#xff0c;每次打开都显示 “plugin_host-3.3 has exited unexpectedly, some plugin functionality won’t be available until Sublime Text has been restarted” 一直没调好&#xff0c;所以我退回到sublime 3了。下载好了软件没问题&#xff0c;但是一…