【WinForm.NET开发】使用 FlowLayoutPanel 在 Windows 窗体上排列控件

本文内容

  1. 创建项目
  2. 水平和垂直排列控件
  3. 更改流方向
  4. 插入流中断
  5. 使用停靠和锚定来定位控件
  6. 使用填充和边距排列控件
  7. 通过在工具箱中双击来插入控件
  8. 通过绘制控件轮廓来插入控件
  9. 使用插入条来插入控件
  10. 将现有控件重新分配给不同的父控件
  11. 后续步骤

某些应用程序要求窗体布局在窗体调整大小或其内容大小更改时能够对窗体自身进行适当地排列。 当您需要进行动态布局,但并不希望在代码中显式处理 Layout 事件时,可以考虑使用布局面板。

FlowLayoutPanel 控件和 TableLayoutPanel 控件为在窗体上排列控件提供了两种直观的方式。 这两个控件为其中包含的子控件的相对位置提供了自动的、可配置的控制功能,并且都能在运行时提供动态布局特性,因此,在父窗体的尺寸更改时,它们能够调整子控件的大小和位置。 可在布局面板内嵌套布局面板,从而实现复杂的用户界面。

TableLayoutPanel 以网格形式排列其内容,所提供的功能类似于 HTML 的 <table> 元素。 其单元格按行和列的方式排列,各行各列的尺寸可以不同。 

FlowLayoutPanel 按特定的流方向排列其内容:水平或垂直。 其内容可从一行换到下一行,或者从一列换到下一列。 另一种情况是不换行,而是将其内容截掉。 本文涉及以下任务:

  • 创建 Windows 窗体项目

  • 水平和垂直排列控件

  • 更改流方向

  • 插入流中断

  • 使用填充和边距排列控件

  • 通过在工具箱中双击来插入控件

  • 通过绘制控件轮廓来插入控件

  • 使用插入符号插入控件

  • 将现有控件重新分配给不同的父控件

完成本演练后,您将理解这些重要布局功能所起的作用。

 提示

显示的对话框和菜单命令可能会与“帮助”中的描述不同,具体取决于您现用的设置或版本。 若要更改设置,请在“工具”菜单上选择“导入和导出设置”。 

1、创建项目

第一步是创建项目并设置窗体。

创建项目

  1. 创建名为“FlowLayoutPanelExample”的基于 Windows 的应用程序项目。 

  2. 在**“窗体设计器”**中选择窗体。

2、水平和垂直排列控件

通过 FlowLayoutPanel 控件可沿行或列放置控件,无需明确指定每个控件的位置。

在父窗体的尺寸发生改变时,FlowLayoutPanel 控件可以调整其子控件的大小和流动。

使用 FlowLayoutPanel 水平或垂直排列控件

  1. 从**“工具箱”**中将一个 FlowLayoutPanel 控件拖到窗体上。

  2. 从**“工具箱”**中将一个 Button 控件拖到 FlowLayoutPanel 中。 注意,该控件被自动移到 FlowLayoutPanel 控件的左上角。

  3. 从**“工具箱”**中将另一个 Button 控件拖到 FlowLayoutPanel 中。 注意,Button 控件被自动移到第一个 Button 控件旁边的位置。 如果 FlowLayoutPanel 过窄,同一行无法容纳两个控件,则新的 Button 控件会被自动移到下一行。

  4. 再从**“工具箱”**中拖几个 Button 控件到 FlowLayoutPanel 中。 继续放置 Button 控件,直到有控件被换到下一行。

  5. 将 FlowLayoutPanel 控件的 WrapContents 属性值更改为 false。 注意,子控件不再流到下一行, 而是被移到第一行并被截掉。

  6. 将 FlowLayoutPanel 控件的 WrapContents 属性值更改为 true。 注意,子控件再次换到下一行。

  7. 减小 FlowLayoutPanel 控件的宽度,直到所有 Button 控件都移动到第一列。

  8. 增加 FlowLayoutPanel 控件的宽度,直到所有 Button 控件都移动到第一行。 您可能需要调整窗体大小以提供更大的宽度。

3、更改流方向

通过 FlowDirection 属性可更改控件排列的方向。 可以从左到右、从右到左、自上而下或自下而上来排列控件。

更改 FlowLayoutPanel 中的流方向

  1. 将 FlowLayoutPanel 控件的 FlowDirection 属性值更改为 TopDown。 注意,子控件会被重新排列成一列或多列,具体依控件的高度而定。

  2. 调整 FlowLayoutPanel 的大小,使其高度小于 Button 控件的列。 注意,FlowLayoutPanel 会重新排列子控件以使其流入下一列。 继续减小高度,注意子控件流入后续列中。 将 FlowLayoutPanel 控件的 FlowDirection 属性值更改为 RightToLeft。 注意,子控件的位置颠倒过来。 将 FlowDirection 属性的值更改为 BottomUp 后,请注意观察布局。

4、插入流中断

FlowLayoutPanel 控件为其子控件提供了 FlowBreak 属性。 如果将 FlowBreak 属性的值设置为 true,则 FlowLayoutPanel 控件将停止沿当前流方向排列控件,并换到下一行或下一列。

插入流中断

  1. 将 FlowLayoutPanel 控件的 FlowDirection 属性值更改为 TopDown。

  2. 从最左边的列的中间选择一个 Button 控件。

  3. 将 Button 控件的 FlowBreak 属性值设置为 true。 注意,该列中断并且选定的 Button 控件之后的控件均流入下一列。 将 Button 控件的 FlowBreak 属性值设置为 false 以返回原始行为。

5、使用停靠和锚定来定位控件

子控件的停靠和锚定行为不同于其他容器控件中的行为。 停靠和锚定都是相对于流方向上的最大控件而言的。

使用停靠和锚定来定位控件

  1. 增加 FlowLayoutPanel 的大小,直到 Button 控件全部被排在一列中。

  2. 选择顶部的 Button 控件。 增加其宽度,使其宽度相当于其他 Button 控件的两倍。

  3. 选择第二个 Button 控件。 将其 Anchor 属性值更改为 Right。 注意,该控件发生了移动,使得其右边界与第一个 Button 控件的右边界对齐了。

  4. 将其 Anchor 属性值更改为 Right 和 Left。 注意,该控件的大小发生了变化,变得与第一个 Button 控件一样宽了。

  5. 选择第三个 Button 控件。 将其 Dock 属性值更改为 Fill。 注意,该控件的大小发生了变化,变得与第一个 Button 控件一样宽了。

6、使用填充和边距排列控件

还可通过更改 Padding 和 Margin 属性来排列 FlowLayoutPanel 控件中的控件。

通过 Padding 属性可控制如何在 FlowLayoutPanel 控件的单元格内放置控件。 该属性指定子控件与 FlowLayoutPanel 控件的边界之间的距离。

通过 Margin 属性可控制控件之间的距离。

使用填充和边距属性排列控件

  1. 将 FlowLayoutPanel 控件的 Dock 属性值更改为 Fill。 如果窗体足够大,Button 控件将被移动到 FlowLayoutPanel 控件的第一列。

  2. 更改 FlowLayoutPanel 控件的 Padding 属性值,方法是在**“属性”**窗口中展开 Padding 项,将 All 属性设置为 20。 注意,子控件被移向 FlowLayoutPanel 控件的中心。 增加 Padding 属性的值会将子控件推离 FlowLayoutPanel 控件的边界。

  3. 选择 FlowLayoutPanel 中的所有 Button 控件,然后将 Margin 属性的值设置 20。 注意,Button 控件之间的距离增大了,这使它们分得更开。 若要看到所有子控件,可能需要将 FlowLayoutPanel 控件调得更大。

7、通过在工具箱中双击来插入控件

双击**“工具箱”**中的控件可以填充 FlowLayoutPanel 控件。

通过双击工具箱中的控件来插入控件

  1. 在**“工具箱”**中双击 Button 控件图标。 注意,FlowLayoutPanel 控件中出现了一个新的 Button 控件。

  2. 在**“工具箱”**中双击更多控件。 注意,新的控件相继出现在 FlowLayoutPanel 控件中。

8、通过绘制控件轮廓来插入控件

可通过在单元格中绘制控件的轮廓向 FlowLayoutPanel 控件中插入控件并指定其大小。

通过绘制控件轮廓来插入控件

  1. 在**“工具箱”**中单击 Button 控件图标。 不要将其拖动到窗体上。

  2. 将鼠标指针放在 FlowLayoutPanel 控件上。 注意在附加 Button 控件图标后指针更改为十字线。

  3. 单击并按住鼠标按钮。

  4. 拖动鼠标指针绘制 Button 控件的轮廓。 对大小感到满意后松开鼠标按钮。 注意,在与 FlowLayoutPanel 控件相邻的空闲位置处创建了一个 Button 控件。

9、使用插入条来插入控件

可将控件插入到 FlowLayoutPanel 控件中的特定位置。 将某个控件拖到 FlowLayoutPanel 控件的工作区以后,会出现一个插入条,指示将要插入该控件的位置。

使用插入符来插入控件

  1. 从**“工具箱”**中将一个 Button 控件拖动到 FlowLayoutPanel 控件中并指向两个 Button 控件之间的空间。 注意,出现了插入条,指示 Button 被放入 FlowLayoutPanel 控件时将置于何处。 在将新的 Button 控件放入 FlowLayoutPanel 控件前,请来回移动鼠标指针,以便观察插入条是如何移动的。

  2. 将新的 Button 控件放入 FlowLayoutPanel 控件。 注意,新的 Button 控件未与其他控件对齐,因为该控件的 Margin 属性具有不同的值。

10、将现有控件重新分配给不同的父控件

可将窗体上现有的控件分配给新的 FlowLayoutPanel 控件。

重定现有控件的父项

  1. 从**“工具箱”**中将三个 Button 控件拖到窗体上。 使控件彼此靠近但不要对齐。

  2. 在**“工具箱”**中单击 FlowLayoutPanel 控件图标。 不要将其拖动到窗体上。

  3. 移动鼠标指针使之靠近三个 Button 控件。 注意,在附加 FlowLayoutPanel 控件图标后,鼠标指针变成了对十字线。

  4. 单击并按住鼠标按钮。

  5. 拖动鼠标指针以绘制 FlowLayoutPanel 控件的轮廓。 围绕三个 Button 控件绘制轮廓。

  6. 释放鼠标按钮。 注意,这三个 Button 控件被插入 FlowLayoutPanel 控件中。

11、后续步骤

可以使用布局面板和控件的组合来实现复杂布局。 建议研究的方面包括:

  • 将 Button 控件之一调到更大并注意这一调整对布局的影响。

  • 布局面板中可包含其他布局面板。 试验将 TableLayoutPanel 控件放入现有控件中。

  • 将 FlowLayoutPanel 控件停靠到父窗体。 调整窗体大小并注意这对布局的影响。

  • 将其中一个控件的 Visible 属性设置为 false,并注意 FlowLayoutPanel 如何对流进行相应的调整。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人工智能与量子计算:开启未知领域的智慧之旅

导言 人工智能与量子计算的结合是科技领域的一场创新盛宴&#xff0c;引领我们进入了探索未知领域的新时代。本文将深入研究人工智能与量子计算的交汇点&#xff0c;探讨其原理、应用以及对计算领域的深远影响。 量子计算的崛起为人工智能领域注入了新的活力&#xff0c;开启了…

利用canvas封装录像时间轴拖动(uniapp),封装上传uniapp插件市场

gitee项目地址,项目是一个空项目,其中包含了封装的插件,自己阅读,由于利用了canvas所以在使用中暂不支持.nvue,待优化; 项目也是借鉴了github上的一个项目,timeline-canvas,​​​​​​​ ​​​​​​​

GPT-4V被超越?SEED-Bench多模态大模型测评基准更新

&#x1f4d6; 技术报告 SEED-Bench-1&#xff1a;https://arxiv.org/abs/2307.16125 SEED-Bench-2&#xff1a;https://arxiv.org/abs/2311.17092 &#x1f917; 测评数据 SEED-Bench-1&#xff1a;https://huggingface.co/datasets/AILab-CVC/SEED-Bench SEED-Bench-2&…

纽扣电池是什么

纽扣电池 电工电气百科 文章目录 纽扣电池前言一、纽扣电池是什么二、纽扣电池的类别三、纽扣电池的作用原理总结前言 纽扣电池具有易于更换的特点,这使得它们成为许多便携设备的理想电源选择。但是,由于它们较小且外壳易于打开,所以家中有婴幼儿的家庭应特别注意将其放置在…

抓包工具:Sunny网络中间件

Sunny网络中间件 和 Fiddler 类似。 是可跨平台的网络分析组件 可用于HTTP/HTTPS/WS/WSS/TCP/UDP网络分析 为二次开发量身制作 支持 获取/修改 HTTP/HTTPS/WS/WSS/TCP/TLS-TCP/UDP 发送及返回数据 支持 对 HTTP/HTTPS/WS/WSS 指定连接使用指定代理 支持 对 HTTP/HTTPS/WS/WSS/T…

Mybatis-Plus利用Sql注入器批量插入更新

Mybatis-Plus是在Mybatis持久层框架上封装的一层非常好用的工具&#xff0c;最近因为想要在Mapper里加入自己自定义的通用方法&#xff0c;所以用到了Mybatis-Plus的Sql注入器。Sql注入器的作用是可以实现自定义的sql脚本并注入到MappedStatement里&#xff0c;从而达到动态拼装…

[css] flex wrap 九宫格布局

<div class"box"><ul class"box-inner"><li>九宫格1</li><li>九宫格2</li><li>九宫格3</li><li>九宫格4</li><li>九宫格5</li><li>九宫格6</li><li>九宫格7&l…

【算法提升—力扣每日一刷】五日总结【12/06--12/10】

文章目录 2023/12/06力扣每日一刷&#xff1a;[206. 反转链表](https://leetcode.cn/problems/reverse-linked-list/) 2023/12/07力扣每日一刷&#xff1a;[203. 移除链表元素](https://leetcode.cn/problems/remove-linked-list-elements/)力扣今日两刷&#xff1a;[19. 删除链…

iOS_给View的部分区域截图 snapshot for view

文章目录 1.将整个view截图返回image&#xff1a;2.截取view的部分区域&#xff0c;返回image&#xff1a;3.旧方法&#xff1a;4.Tips参考&#xff1a; 1.将整个view截图返回image&#xff1a; 这些 api 已被废弃&#xff0c;所以需要判断 iOS 版本 写两套代码&#xff1a; R…

NVMe over Fabrics with SPDK with iRDMA总结 - 1

1.0 Introduction简介 NVM Express* (NVMe*) drives are high-speed, low-latency, solid-state drives (SSDs), that connect over the server Peripheral Component Interconnect Express* (PCIe*) bus. NVM Express* (NVMe*) 硬盘是高速、低延迟的固态硬盘 (SSD),通过服…

轻松制作健身预约小程序

如果你想制作一个健身预约小程序&#xff0c;实现高效预约与健身管理&#xff0c;可以按照以下步骤进行操作。 第一步&#xff1a;注册登录乔拓云平台&#xff0c;进入后台 第二步&#xff1a;点击【轻应用小程序】&#xff0c;进入设计小程序页面。 第三步&#xff1a;在设计小…

Python基础(八、random模块探秘)

大家好&#xff0c;今天我要和你们聊一聊一个非常有趣的Python模块——random。它就像是一个疯狂的抽签者&#xff0c;总是在背后悄悄地为我们制造出各种各样的随机事件。让我们一起来揭开random的神秘面纱&#xff0c;看看它到底能带给我们哪些惊喜&#xff01; 文章目录 1. …

uniGUI学习之Cookie

UniApplication.Cookies.SetCookie( const ACookieName: string, const AValue: string, AExpires: TDateTime 0, ASecure: Boolean False, AHTTPOnly: Boolean False, const APath: string / )

多汗症的预防措施有哪些?

多汗症的预防措施主要包括以下几个方面&#xff0c;通过这些措施&#xff0c;可以有效地减少多汗症的发生&#xff0c;提高生活质量。 一、保持身体清洁 保持身体清洁是预防多汗症的重要措施之一。每天洗澡&#xff0c;特别是在运动或出汗后&#xff0c;及时更换衣物&#xf…

Python-类视图和蓝图

目录 一.类视图 二.蓝图 一.类视图 在Flask中&#xff0c;可通过视图函数展示视图 http://t.csdnimg.cn/r6IFG 也可基于类实现&#xff0c;类视图的好处是支持继承。标准类视图是继承flask.views模块中基类View的子类 from flask.views import View 该子类中必须重写View…

查找一个时间序列中一个具体时刻的所有值Series.at_time()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 查找时间序列中 指定的具体时刻 对应的所有元素 Series.at_time() [太阳]选择题 以下代码的输出结果中正确的是? import pandas as pd i pd.date_range(2023-12-10, periods4, freq12H) r p…

tcp/ip协议2实现的插图,数据结构5 (22 - 章)

(103) 103 二二1 协议控制块 结构 file, socket , rawcb , inpcb , tcpcb 之间的联系 (104) (105)

转载:TableView性能优化

转载&#xff1a;TableView性能优化 原文链接&#xff1a;https://juejin.cn/post/6955731915672387592 tableView性能优化 Cell重用、标识重用 使用 static 修饰重用标识名称能够保证这个标识只会创建一次&#xff0c;提高性能。接着调用dequeueReusableCellWithIdentifie…

超越架构师!消息通知系统优化设计

5 收集联系信息流程 为发送通知&#xff0c;需收集各种信息如移动设备令牌、email、phone和第三方通道信息。 用于存储联系信息的简化的数据库表模式。它是个带有电子邮件、电话、设备令牌和外部通道的单个NoSQL DynamoDB表。Contacts table schema&#xff1a; device_tokens…

LeetCode(63)旋转链表【链表】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 旋转链表 1.题目 给你一个链表的头节点 head &#xff0c;旋转链表&#xff0c;将链表每个节点向右移动 k 个位置。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], k 2 输出&#xff1a;[4,5,1,2,3]示例 2&…