WPF 布局控件

wpf 布局控件有很多,常用的有:Grid, UniformGrid, Border, StackPanel, WrapPanel, DockPanel。

1. Grid

Grid 经常作为控件的 Content 使用,常作为 Windows, UserControl 等 UI 元素的根节点。它用来展示一个 n 行 n 列的排版。

因此就有下面几个常用且重要的属性:

  1. RowDefinitionsColumnDefinitions:行定义、列定义
  2. Grid.RowGrid.Column:子元素位于 Grid 第几行、第几列

1.1 RowDefinitions 和 ColumnDefinitions

RowDefinitions :有个重要属性 Height,它有 3 种值:

  • 常规数值,如100,200,单位是像素,表示该行的实际像素高度。
  • * 值, 如1*,2*,1.5*,表示占比,比如 2* 就是 1* 的两倍高。
  • Auto”, 表示高度自动伸缩。

ColumnDefinitions :也有个重要属性 Width,也有类似 3 种值:

  • 常规数值,如100,200,单位是像素,表示该列的实际像素宽度。
  • * 值, 如1*,2*,1.5*,表示占比,比如 2* 就是 1* 的两倍宽。
  • Auto”, 表示宽度自动伸缩。

1.2 Grid.Row 和 Grid.Column

这两个属性,实际上是 RowColumn 属性,为什么要加上 Grid. ,原因是它们是定义在 Grid 类里的 附加属性

它俩是用来标识当前控件位于 Grid 哪行哪列,即:

Grid.Row 设置值: 表示该控件处于父类 Grid 的第几行。
Grid.Column 设置值: 表示该控件处于父类 Grid 的第几列。

例子,

 <!-- 创建一个 3 行 3 列 的布局 -->
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
        <RowDefinition Height="1.5*" />
    </Grid.RowDefinitions>

    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="2*" />
        <ColumnDefinition Width="Auto" />
    </Grid.ColumnDefinitions>

    <Grid Grid.Row="0" Grid.Column="0" Background="Red" />
    <Grid Grid.Row="0" Grid.Column="1" Background="IndianRed" />
    <Grid Grid.Row="0" Grid.Column="2" Background="OrangeRed" />

    <Grid Grid.Row="1" Grid.Column="0" Background="Green" />
    <Grid Grid.Row="1" Grid.Column="1" Background="GreenYellow" />
    <Grid Grid.Row="1" Grid.Column="2" Background="DarkSlateGray" />

    <Grid Grid.Row="2" Grid.Column="0" Background="Blue" />
    <Grid Grid.Row="2" Grid.Column="1" Background="DodgerBlue" />
    <Grid Grid.Row="2" Grid.Column="2" Background="PowderBlue" />
</Grid>

结果:
在这里插入图片描述
为什么只剩 2 行 2 列了?第 1 行和第 3 列哪去了?
因为:第 1 行高度和第 3 列宽度都被设置为了 Auto, Auto 会根据相邻或子元素自动排版,没有子元素时,实际宽高就为0。

给第 1 行任意一列填充实际子元素,第 3 列任意一行填充实际子元素,

<Grid Grid.Row="0" Grid.Column="0" Background="Red">
    <TextBlock Height="80" Text="第 1 行,第 1 列" />
</Grid>
<Grid Grid.Row="0" Grid.Column="1" Background="IndianRed" />
<Grid Grid.Row="0" Grid.Column="2" Background="OrangeRed" />

<Grid Grid.Row="1" Grid.Column="0" Background="Green" />
<Grid Grid.Row="1" Grid.Column="1" Background="GreenYellow" />
<Grid Grid.Row="1" Grid.Column="2" Background="DarkSlateGray" />

<Grid Grid.Row="2" Grid.Column="0" Background="Blue" />
<Grid Grid.Row="2" Grid.Column="1" Background="DodgerBlue" />
<Grid Grid.Row="2" Grid.Column="2" Background="PowderBlue">
    <TextBlock Height="80" Text="第 3 行,第 3 列" />
</Grid>

所有行列就都显示了:
在这里插入图片描述

2. UniformGrid

一般称作网格布局,因为它以均匀的网格方式排列容器中的子元素,不用再像 Grid 那样手动指定每个元素的行和列,会自动按顺序(从左到右、从上到下)展示。每个子元素占用相同大小的空间。

<UniformGrid Columns="2" Rows="2">
    <Grid Background="Red">
        <TextBlock Text="1" FontSize="20" Foreground="White" HorizontalAlignment="Center" VerticalAlignment="Center" />
    </Grid>
    <Grid Background="Brown">
        <TextBlock Text="2" FontSize="20" Foreground="White" HorizontalAlignment="Center" VerticalAlignment="Center" />
    </Grid>
    <Grid Background="DarkGoldenrod">
        <TextBlock Text="3" FontSize="20" Foreground="White" HorizontalAlignment="Center" VerticalAlignment="Center" />
    </Grid>
    <Grid Width="100" Height="100" Background="Green">
        <TextBlock Text="4" FontSize="20" Foreground="White" HorizontalAlignment="Center" VerticalAlignment="Center" />
    </Grid>
</UniformGrid>

在这里插入图片描述

3. Border

Border 就是带有边框的区域布局,既然是边框就有边框颜色和边框厚度。

BorderBrush: 边框颜色
BorderThickness: 边框厚度(从左右到依次:左、上、 右、 下 厚度)

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>

    <!-- 不带边框 -->
    <Border
        Width="100"
        Height="100"
        Background="DeepPink" />

    <!-- 带边框 -->
    <Border Grid.Column="1"
            Width="100"
        Height="100"
        Background="DeepPink"
        BorderBrush="Black"
        BorderThickness="4" />
</Grid>

在这里插入图片描述

4. StackPanel 和 WrapPanel

从名字可以看出,StackPanel 即按照栈的方式排版子元素,WrapPanel 在按照栈方式排版基础上,超出显示范围时可以自动换行或换列。

4.1 StackPanel

StackPanel 演示

横向排列:

<StackPanel Orientation="Horizontal">
    <Grid Width="100" Height="40" Background="DeepPink"></Grid>
    <Grid Width="100" Height="40" Background="DarkOrchid"></Grid>
    <Grid Width="100" Height="40" Background="DarkGreen"></Grid>
</StackPanel>

在这里插入图片描述
竖向排列:

<StackPanel Orientation="Vertical">
    <Grid Width="100" Height="40" Background="DeepPink" />
    <Grid Width="100" Height="40" Background="DarkOrchid" />
    <Grid Width="100" Height="40" Background="DarkGreen" />
</StackPanel>

在这里插入图片描述

4.2 WrapPanel

WrapPanel 演示

横向排列:

<WrapPanel Orientation="Horizontal">
    <Grid Width="100" Height="40" Background="DeepPink" />
    <Grid Width="100" Height="40" Background="DarkOrchid"/>
    <Grid Width="100" Height="40" Background="DarkGreen"/>
</WrapPanel>

在这里插入图片描述
当宽度显示不下时自动换行:
在这里插入图片描述

竖向排列:

<WrapPanel Orientation="Vertical">
    <Grid Width="100" Height="40" Background="DeepPink"/>
    <Grid Width="100" Height="40" Background="DarkOrchid"/>
    <Grid Width="100" Height="40" Background="DarkGreen"/>
</WrapPanel>

在这里插入图片描述
当高度显示不下时,自动换列
在这里插入图片描述

5. DockPanel

使用锚点停靠方式在 DockPanel 区域中进行排版。

例如,

<DockPanel>
    <Grid DockPanel.Dock="Left" Width="40" Background="DeepPink" />
    <Grid DockPanel.Dock="Top" Height="40" Background="GreenYellow" />
    <Grid DockPanel.Dock="Right" Width="40" Background="DodgerBlue" />
    <Grid DockPanel.Dock="Bottom" Height="40" Background="Coral" />
</DockPanel>

在这里插入图片描述
为什么底部 Grid 元素不是在最下面,跑中间去了?

默认情况下,后添加的元素只能使用剩余空间,无论对 DockPanel 的最后一个子元素设置任何停靠值,该子元素都将始终填满剩余的空间。如果不希望最后一个元素填充剩余区域,可以将 DockPanel 属性 LastChildFill设置为 false,还必须为最后一个子元素显式指定停靠方向。

我们可以做个实验,把底部 Grid 高度设置去掉,

<Grid DockPanel.Dock="Bottom" Background="Coral" />

就变成了,
在这里插入图片描述
最后我们实验一下 LastChildFill 设置

<DockPanel LastChildFill="False">
    <Grid DockPanel.Dock="Left" Width="40" Background="DeepPink" />
    <Grid DockPanel.Dock="Top" Height="40" Background="GreenYellow" />
    <Grid DockPanel.Dock="Right" Width="40" Background="DodgerBlue" />
    <Grid DockPanel.Dock="Bottom" Height="40" Background="Coral" />
</DockPanel>

在这里插入图片描述

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

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

相关文章

内网渗透横向移动技巧

在正常情况中&#xff0c;横向移动是在已经获取了足够的权限的情况下进行横向移动&#xff0c;下面中的方法大部分也需要高权限的操作。 https://www.freebuf.com/articles/network/251364.html 内网横向移动分为三种情况&#xff1a; 1.在VPN环境中进行横向移动&#xff1b; 2…

MONI后台管理系统-swagger3(springdoc-openapi)集成

springdoc-openapi Java 库有助于使用 Spring Boot 项目自动生成 API 文档。springdoc-openapi 通过在运行时检查应用程序来根据 Spring 配置、类结构和各种注释推断 API 语义。 该库会自动生成 JSON/YAML 和 HTML 格式的页面文档。生成的文档可以使用swagger-api注释进行补充。…

C/C++圣诞树

系列文章 序号直达链接1C/C爱心代码2C/C跳动的爱心3C/C李峋同款跳动的爱心代码4C/C满屏飘字表白代码5C/C大雪纷飞代码6C/C烟花代码7C/C黑客帝国同款字母雨8C/C樱花树代码9C/C奥特曼代码10C/C精美圣诞树11C/C俄罗斯方块12C/C贪吃蛇13C/C孤单又灿烂的神-鬼怪14C/C闪烁的爱心15C…

前端网页开发学习(HTML+CSS+JS)有这一篇就够!

目录 HTML教程 ▐ 概述 ▐ 基础语法 ▐ 文本标签 ▐ 列表标签 ▐ 表格标签 ▐ 表单标签 CSS教程 ▐ 概述 ▐ 基础语法 ▐ 选择器 ▐ 修饰文本 ▐ 修饰背景 ▐ 透明度 ▐ 伪类 ▐ 盒子模型 ▐ 浮动 ▐ 定位 JavaScript教程 ▐ 概述 ▐ 基础语法 ▐ 函数 …

vue3和element-plus笔记

对子组件直接使用v-model 子组件内定义如下 const props defineProps({modelValue: {type: String,required: true} }) const emits defineEmits(["update:modelValue"]) 父组件定义如下 <script setup> const deleteId ref(null) </script> <…

Buck开关电源闭环控制的仿真研究15V/5V[Matlab/simulink源码+Word文档]

课题设计要求 ⑴输入直流电压(VIN)&#xff1a;15V ⑵输出电压(VO)&#xff1a;5.0V ⑶负载电阻&#xff1a;R2欧 ⑷输出电压纹波峰-峰值 Vpp≤50mV &#xff0c;电感电流脉动&#xff1a;输出电流的10% ⑸开关频率(fs)&#xff1a;100kHz ⑹BUCK主电路二极管的通态压降VD0.5V…

单元测试使用记录

什么是单元测试 简单来说就是对一个类中的方法进行测试&#xff0c;对输出的结果检查判断是否符合预期结果 但是在多年的工作中&#xff0c;从来没有哪个项目中真正系统的用到了单元测试&#xff0c;因此对它还是很陌生的&#xff0c;也就造成更加不会在项目中区使用它。 如何…

麒麟操作系统服务架构保姆级教程(三)ssh远程连接

如果你想拥有你从未拥有过的东西&#xff0c;那么你必须去做你从未做过的事情 作为一名成熟运维架构师&#xff0c;我们需要管理的服务器会达到几十台&#xff0c;上百台&#xff0c;上千台&#xff0c;甚至是上万台服务器&#xff0c;而且咱们的服务器还不一定都在一个机房&am…

2024年图像处理、多媒体技术与机器学习

重要信息 官网&#xff1a;www.ipmml.org 时间&#xff1a;2024年12月27-29日 地点&#xff1a;中国-大理 简介 2024年图像处理、多媒体技术与机器学习&#xff08;CIPMT 2024&#xff09;将于2024年12月27-29日于中国大理召开。将围绕图像处理与多媒体技术、机器学习等在…

用Python在Excel工作表中创建、修改及删除表格区域

在数据分析和自动化处理的工作中&#xff0c;Excel作为一种强大的工具被广泛应用&#xff0c;而通过Python来操作Excel工作表中的表格&#xff0c;可以极大提高工作效率。表格&#xff08;Table&#xff09;是Excel中的一种重要结构&#xff0c;它是一个特殊的单元格区域&#…

【AI】✈️问答页面搭建-内网穿透公网可访问!

目录 &#x1f44b;前言 &#x1f440;一、后端改动 &#x1f331;二、内网穿透 &#x1f49e;️三、前端改动 &#x1f379;四、测试 &#x1f4eb;五、章末 &#x1f44b;前言 小伙伴们大家好&#xff0c;上次本地搭建了一个简单的 ai 页面&#xff0c;实现流式输出问答…

GM_T 0039《密码模块安全检测要求》题目

单项选择题 根据GM/T 0039《密码模块安全检测要求》,送检单位的密码模块应包括()密码主管角色。 A.一个 B.两个 C.至少一个 D.至少两个 正确答案:C 多项选择题 根据GM/T 0039《密码模块安全检测要求》,关于非入侵式安全,以下属于安全三级密码模块要求的是()。 …

使用生存分析进行游戏时间测量

标题&#xff1a;Playtime Measurement with Survival Analysis 作者&#xff1a;Markus Viljanen, Antti Airola, Jukka Heikkonen, Tapio Pahikkala 译者&#xff1a;游戏数据科学 1 游戏中的游戏时间 1.1 为什么游戏时间很重要 游戏分析在理解玩家行为方面变得越来越重…

Linux快速入门-兼期末快速复习使用

Linux快速入门-兼期末快速复习使用 一小时快速入门linux快速一&#xff1a;Linux操作系统概述1. Linux概述1.1 定义与特点1.2 起源与发展1.3 Linux结构1.4 版本类别1.5 应用和发展方向 2. 安装与启动2.1 Windows下VMware安装Linux2.2 安装Ubuntu 快速二&#xff1a;linux的桌面…

制造研发企业与IPD管理体系

芯片/半导体/制造研发型企业&#xff0c;大都知道华为使用过的IPD管理体系&#xff0c;但大家用到什么程度&#xff0c;那就是参差不齐了。 因为IPD管理体系它只是一个管理理念&#xff0c;是一个方法论。它需要有相应的组织架构来承载&#xff0c;它有很复杂的流程需要有IT系统…

帝国CMS自动生成标题图片并写进数据库

帝国CMS背景可自定义&#xff0c;可单独背景也可以随机背景,此插件根帝国cms官方论坛帖子改的&#xff0c;增加了生成图片后写入数据库,笔者的古诗词网 www.gushichi.com 也是这样设置的。 效果图 将下面的代码插入到/e/class/userfun.php中增加如下函数 单独背景代码 //自动…

数据分析和AI丨知识图谱,AI革命中数据集成和模型构建的关键推动者

人工智能&#xff08;AI&#xff09;已经吸引了数据科学家、技术领导者以及任何使用数据进行商业决策者的兴趣。绝大多数企业都希望利用人工智能技术来增强洞察力和生产力&#xff0c;而对于这些企业而言&#xff0c;数据集的质量差成为了最主要的障碍。 数据源需要进行清洗且明…

java小知识点:比较器

java中自主排序主要根据一个Comparator类来实现。 他内部实现用的是Timsort策略。大概思想是说将整个集合分成几个小段&#xff0c;每个小段分别排序&#xff0c;然后再拼在一起。 主要用法是传入两个数&#xff08;也可以不是Integer或int类型&#xff0c;这里只是把他们都统称…

【嵌入式开发笔记】OpenOCD到嵌入式调试

最近在把玩一块Risc-V的开发板&#xff0c;使用开发板调试时&#xff0c;需要用到专门的下载器和OpenOCD进行调试。 为了连接这个板子&#xff0c;费了九牛二虎之力。 这里简单记录一下自己的折腾经过吧。 0x00 环境准备 0x0001 调试背景 系统&#xff1a;Virtual Box Ub…

安装MongoDB,环境配置

官网下载地址&#xff1a;MongoDB Shell Download | MongoDB 选择版本 安装 下载完成双击打开 点击mongodb-windows-x86_64-8.0.0-signed 选择安装地址 检查安装地址 安装成功 二.配置MongoDB数据库环境 1.找到安装好MongoDB的bin路径 复制bin路径 打开此电脑 -> 打开高级…