当前位置: 首页 > news >正文

WPF学习(1)-Grid控件(网格布局)

Grid控件其实是一个窗体的默认控件,我们创建一个WPF应用程序后,其主窗体里面会有一个Grid控件。
在这里插入图片描述

Grid有两个非常关键的属性ColumnDefinitionsRowDefinitions,分别表示列的数量集合和行的数量集合。

  • ColumnDefinitions集合中的元素类型是ColumnDefinition类,
  • RowDefinitions集合中元素类型是RowDefinition类。

默认的Gridr控件没有定义行数和列数,也就是说,Grid默认情况下,行数和列数都等于1,那么它就只有一个单元格。

左右排列

<Grid ><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition/></Grid.ColumnDefinitions><Button Grid.Column="0" Content="1" Panel.ZIndex="1" Margin="20" Padding="50" /><Button Grid.Column="1" Content="2" Panel.ZIndex="0" Margin="20" Padding="50" />
</Grid>

我们在Grid控件的ColumnDefinitions属性增加了两个ColumnDefinition对象,
如果分别设置了两个按钮的Grid.Column附加属性,指示两个Button分别显示在第一列和第二列,从而实现了左右排列。

上下排列

<Grid><Grid.RowDefinitions><RowDefinition/><RowDefinition/></Grid.RowDefinitions><Button Grid.Row="0" Content="1" Panel.ZIndex="1" Margin="20" Padding="50" /><Button Grid.Row="1" Content="2" Panel.ZIndex="0" Margin="20" Padding="50" /></Grid>

在这里插入图片描述
要实现上下排列,我们只需要在Grid控件的RowDefinitions中增加两行元素即可,即RowDefinition对象。
指定每个Button显示在哪一行,例如Grid.Row=“0”,表示显示在第一行。

上下左右排列

<Grid><Grid.RowDefinitions><RowDefinition/><RowDefinition/></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition/></Grid.ColumnDefinitions><Button Grid.Row="0" Grid.Column="0" Content="1" Panel.ZIndex="1" Margin="20" /><Button Grid.Row="0" Grid.Column="1" Content="2" Panel.ZIndex="0" Margin="20" /><Button Grid.Row="1" Grid.Column="0" Content="3" Panel.ZIndex="1" Margin="20" /><Button Grid.Row="1" Grid.Column="1" Content="4" Panel.ZIndex="0" Margin="20" />
</Grid>

在这里插入图片描述

跨列排列

 <Grid><Grid.RowDefinitions><RowDefinition/><RowDefinition/></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition/></Grid.ColumnDefinitions><Button Grid.Row="0" Grid.Column="0" Content="1" Panel.ZIndex="1" Margin="20" Grid.ColumnSpan="2"/><Button Grid.Row="1" Grid.Column="0" Content="3" Panel.ZIndex="1" Margin="20" /><Button Grid.Row="1" Grid.Column="1" Content="4" Panel.ZIndex="0" Margin="20" /></Grid>

在这里插入图片描述

在原有基础上删掉了一个按钮,并将第一个按钮的Grid.ColumnSpan附加属性设置为2,表示从第0列往右跨两列,正好就呈现出图中的效果。
跨行显示,只需要设置按钮的Grid.RowSpan属性

固定列宽

 <Grid><Grid.RowDefinitions><RowDefinition/><RowDefinition/></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition Width="120"/><ColumnDefinition/></Grid.ColumnDefinitions><Button Grid.Row="0" Grid.Column="0" Content="1" Panel.ZIndex="1" Margin="20" /><Button Grid.Row="0" Grid.Column="1" Content="2" Panel.ZIndex="0" Margin="20" /><Button Grid.Row="1" Grid.Column="0" Content="3" Panel.ZIndex="1" Margin="20" /><Button Grid.Row="1" Grid.Column="1" Content="4" Panel.ZIndex="0" Margin="20" /></Grid>

在这里插入图片描述
只需要设置第一行ColumnDefinition的Width属性,让其宽度固定为120像素,那么第二列的宽度等于Grid的宽度减去120像素,其内部的Button宽度也随之自适应。

调整行高和列宽

  • 绝对设置尺寸:使用设备无关单位准确地设置尺寸,就是给一个实际的数字,但通常将此值指定为整数(像素)。如:<ColumnDefinition Width="100"></ColumnDefinition>
  • 自动设置尺寸:值为Auto,实际作用就是取实际控件所需的最小值,每行和每列的尺寸刚好满足需要,这是最有用的尺寸设置方式。如:<ColumnDefinition Width="Auto"></ColumnDefinition>
  • 按比例设置设置尺寸:按比例将空间分割到一组行和列中。这是对所有行和列的标准设置。通常值为或N,实际作用就是取尽可能大的值,当某一列或行被定义为则是尽可能大,当出现多列或行被定义为则是代表几者之间按比例方设置尺寸。如:<ColumnDefinition Width="*"></ColumnDefinition>

指定权重,即第2列的宽度是第1列的两倍

<RowDefinition Height="*"></RowDefinition>
<RowDefinition Height="2*"></RowDefinition>

Grid显示网格线

 <Grid ShowGridLines="True" Margin="10"><Grid.RowDefinitions><RowDefinition/><RowDefinition/></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition Width="120"/><ColumnDefinition/></Grid.ColumnDefinitions><Button Grid.Row="0" Grid.Column="0" Content="1" Panel.ZIndex="1" Margin="20" /><Button Grid.Row="0" Grid.Column="1" Content="2" Panel.ZIndex="0" Margin="20" /><Button Grid.Row="1" Grid.Column="0" Content="3" Panel.ZIndex="1" Margin="20" /><Button Grid.Row="1" Grid.Column="1" Content="4" Panel.ZIndex="0" Margin="20" /></Grid>

在这里插入图片描述
只需要设置Grid的ShowGridLines=True,就可以显示Grid的网格线,但是这种虚线效果并不友好。

所以我们有如下方案:

    <Grid Margin="5"><Grid.ColumnDefinitions><ColumnDefinition Width="120" /><ColumnDefinition/></Grid.ColumnDefinitions><Grid.RowDefinitions><RowDefinition/><RowDefinition/></Grid.RowDefinitions><Border Grid.Row="0" Grid.RowSpan="2" Grid.Column="0" Grid.ColumnSpan="2" BorderBrush="Red" BorderThickness="1"/><Border Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" BorderBrush="Red" BorderThickness="0 0 0 1"/><Border Grid.Row="0" Grid.RowSpan="2" Grid.Column="0" BorderBrush="Red" BorderThickness="0 0 1 0"/><Button Grid.Row="0" Grid.Column="0" Content="1" Panel.ZIndex="1" Margin="20"/><Button Grid.Row="0" Grid.Column="1" Content="1" Panel.ZIndex="1" Margin="20"/><Button  Grid.Row="1" Grid.Column="0" Content="3" Panel.ZIndex="1" Margin="20"  /><Button Grid.Row="1"  Grid.Column="1" Content="4" Panel.ZIndex="0" Margin="20" /></Grid>

在这里插入图片描述
我们在Grid内部增加了3个Border,第一个Border用来显示外边框,第二个Border显示中间的横线,第三个Border显示中间的竖线。
通过Grid的跨行和跨列属性,边框颜色刷子BorderBrush和边框厚度BorderThickness。

总结

Grid控件绝对是WPF中所有布局控件中最好用的一个,因为它自适应屏幕的宽度,最关键的一点是,它在呈现时,其ActualWidth实际宽度和ActualHeight实际高度会有一个计算值,我们在业务开发中,有时候要根据父控件的实际宽度和高度来计算子控件的呈现位置和大小。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 一体化水位站的综合优势
  • podman学习笔记
  • JavaScript 实例:掌握编程技巧
  • cd-detect-level
  • rosbag中的图像话题转为图片
  • 大语言模型(LLM)构建产品的一年经验总结【干货长文】
  • vue3修改带小数点的价格数字:小数点的前后数字,要分别显示成不同颜色和大小!已经封装成组件了!
  • 基于 Java Supplier与Predicate 封装自动重试机制通用接口
  • 指针函数和函数指针
  • 企业级OV通配符/泛域名https证书申请
  • 大模型检索X一键成片,巴黎奥运的AI新演绎
  • 敏捷与DevOps有什么不同?
  • pyflink的row
  • 渗透小游戏,各个关卡的渗透实例
  • 指针的指针作为形参实测
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • 77. Combinations
  • es6要点
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • Java Agent 学习笔记
  • maya建模与骨骼动画快速实现人工鱼
  • 分类模型——Logistics Regression
  • 将 Measurements 和 Units 应用到物理学
  • 聊聊flink的BlobWriter
  • 入门到放弃node系列之Hello Word篇
  • 删除表内多余的重复数据
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 关于Android全面屏虚拟导航栏的适配总结
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​低代码平台的核心价值与优势
  • ​如何使用QGIS制作三维建筑
  • ​十个常见的 Python 脚本 (详细介绍 + 代码举例)
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • #1014 : Trie树
  • #1015 : KMP算法
  • #70结构体案例1(导师,学生,成绩)
  • #职场发展#其他
  • (Java入门)学生管理系统
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (编译到47%失败)to be deleted
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (论文阅读30/100)Convolutional Pose Machines
  • (每日一问)设计模式:设计模式的原则与分类——如何提升代码质量?
  • (三)Kafka 监控之 Streams 监控(Streams Monitoring)和其他
  • (四)stm32之通信协议
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (图文详解)小程序AppID申请以及在Hbuilderx中运行
  • (推荐)叮当——中文语音对话机器人
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转)shell中括号的特殊用法 linux if多条件判断
  • ****三次握手和四次挥手
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .net core 6 redis操作类