.Net/C#开发WinFrom布局详解tjwangzhen

Dock和Anchor是水火不容的,同时给控件设置Dock和Anchor属性时后设置的会覆盖前面的设置。

Dock

我初接触WinForm的时候发现控件的Width和Height只能是int,不能设置为百分比,那个时候就想子控件如何跟着父控件而变化呢?父控件变大就变大,而且还填满那个区域。甚至以为这个需要通过代码来解决,如是在SizeChanged事件里……

后来才发现我要的就是Dock给的,Dock是停靠的意思。Dock属性的类型是DockStyle枚举:

1:publicenumDockStyle

3:None=0,

4:Top=1,

5:Bottom=2,

6:Left=3,

7:Right=4,

8:Fill=5

9:}

Panel2后添加进去,所以它具有更高的优先级,更靠近Form的边缘。这个规则不仅仅对于Dock都设为Left的有效,对Dock属性不同,但是碰到一起的子控件也适用:

1:this.panel1.Dock=DockStyle.Left;

2:this.panel2.Dock=DockStyle.Left;

3:this.panel3.Dock=DockStyle.Top;

4:

5:this.Controls.Add(this.panel1);

6:this.Controls.Add(this.panel2);

7:this.Controls.Add(this.panel3);

当然,这里的“优先级”比较只在同一个“层次”起作用,将子控件与父控件同一层次的控件相比较是没有意义的。

Anchor

Dock一般是划分区域的,将一个窗体或大控件划分几个大区域以便布局,就像Web中的div一样。但有的时候我们却想子控件在父控件里的相对位置不要随着父控件的变大缩小而变化,或者控件边缘距离父控件边缘的相对距离不要发生变化,但又不是停靠在父控件的边缘,这就是Anchor该出场的时候了。

Anchor属性的类型是AnchorStyles位标记(如果不理解位标记就将其理解为可以使用位运算符进行操作,从而可以设置多个值的枚举吧,深入理解请参见MSDN或《CLRviaC#》中对位标记的描述):

1:[Flags]

2:publicenumAnchorStyles

3:{

4:None=0,

5:Top=1,

6:Bottom=2,

7:Left=3,

8:Right=4

Anchor的默认值是Anchor.Left|Anchor.Top,也就是子控件与父控件的左边缘和上边缘的相对位置不会变化,这也保证了在窗体最大化后子控件的位置不会发生变化:

窗体默认显示时->

窗体变大后->

总之,记着Anchor的中文意思:锚。当给控件设置Anchor的时候,就相当于用一个铁钉将控件的边缘给钉住。

Padding&Margin

Padding和Margin没有什么好说的,和CSS的盒模型描述的一模一样,Padding指的是控件内部空间,Margin指的是控件之外的:

padding和margin都可以指定四个值。

AutoSize

有的时候我们需要控件随着里面的内容的增长而增长,比如在做多语言的程序时,各国的语言描述同一个意思的时候长度会不同,这个时候就需要AutoSize为true了,这样当文字过长不会被截断。关于AutoSize更详细的内容请参见。

如何面对复杂界面?出了问题咋办?

设计时

当界面变得越来越复杂的时候,我们很期望了解控件之间的层次关系,这个按钮是放在哪个Panel上?这个Panel的区域又是咋样的。我刚接触WinForm的时候,我非常期望WinForm上也有类似于IEDeveloperToolbar的工具,点击HTML,可以可视化的在界面上显示区域,在界面上选中某区域,也可以定位到HTML元素。实际上在设计WinForm界面时也是可以的。这就是VisualStudio的DocumentOutline窗口(View->OtherWindows->DocumentOutline):

不过如果你只想顺着button1->panel4->panel3->……这条线导航控件树,有更方便的方法:ESC键。选中一个控件,然后敲ESC键就会顺着这个控件层次不断的上溯。

选中一个控件,然后点击右键,还会出现Select…的菜单,可以选中该控件的某个父控件:

真是够方便的~~~

运行时

不过有个问题是,上面的方法都是设计时的,有的时候我们的程序中如果动态的修改了某些涉及布局的属性最后发现界面乱套了,这可咋整。运行时的问题当然要运行时解决,给某个父控件附加Layout事件,当修改了涉及Layout的属性时会触发这个事件(也有特例,下一节介绍)。这个事件会有一个LayoutEventArgs参数,该参数有AffectedProperty属性,该属性指示的就是影响布局的罪魁祸首,你就找到病症所在了。

SuspendLayout&ResumeLayout

我想大家对这两个方法肯定不默认,几乎在WinForm里的InitializeComponent方法里,在方法开始处有会调用SuspendLayout方法,然后在方法快结束处会调用ResumeLayout方法。有些的读者也许还尝试过删除这两个方法,发现程序表现行为和以前也一样。

了解这两个方法对WinForm程序的性能还是挺有帮助的,在上一节提到修改涉及Layout的属性时会触发Layout事件,但是有特例,特例就是调用了SuspendLayout方法,关于修改哪些属性会触发Layout事件请查阅MSDN。在代码中如果修改Size、Dock等属性或向父控件添加子控件时,会执行布局逻辑,有的时候甚至会重绘。当我们要修改一堆的这样的属性时,比如前面提到的InitializeComponent方法,我们当然不想修改一下就执行一次布局逻辑,那太慢了。这个时候在修改之前你就可以调用SuspendLayout方法挂起布局逻辑,等所有属性都设置好后再调用ResumeLayout属性,特别是在界面很复杂的时候性能有很大的提升。

VisualStudio默认将设置这些属性的语句全部放在InitializeComponent方法里,然后用SuspendLayout和ResumeLayout括住,所以我们一般不要自作主张的将这些属性移出到外面设置,不过有的时候我们想在代码里动态生成一些界面,比如添加一些子控件什么的,我们最好也像VS干的那样调用这两个方法。

要注意的是,并不是调用了Form的SuspendLayout和ResumeLayout方法就一了百了了。如果你是向一个Panel添加子控件,你还得调用Panel的这两个方法。

总结

本文介绍了WinForm界面布局的初步知识,还介绍了通过临时挂起布局逻辑来优化程序性能。这些都很基础也很简单,应付简单的布局是够了,不过对于更灵活更复杂的布局就要涉及布局引擎的内容了,这个我会在下一节里介绍。

看不到图片,不知道效果,不知道和C1Ribbon比起来哪各更好

THE END
1..net6.0winform管理系统.NET 6.0 Winform 管理系统是一个基于.NET 6.0框架开发的应用程序,使用Winform作为界面设计工具,主要用于企业的信息管理和业务流程管理。该系统可以帮助企业实现员工管理、客户管理、订单管理、库存管理、财务管理等功能,提高企业的工作效率和管理水平。 该系统采用了.NET 6.0框架,具有良好的稳定性和安全性,可以在Windowshttps://wenku.csdn.net/answer/42xi9xsb1t
2.winform桌面端管理系统demowinform界面设计教程C# WinForm 编程需要创建「Windows窗体应用程序」项目。 .NET 提供了大量 Windows 风格的控件和事件,我们可以直接拿来使用,上手简单,开发快速。 Windows 窗体应用程序是 C# 语言中的一个重要应用,也是 C# 语言最常见的应用。 这套C# WinForm 教程将教会大家如何使用 WinForm 进行界面设计,并绑定对应的事件,开发出一个https://blog.51cto.com/u_16099178/11542877
3.C/S架构轻量级快速开发框架WinFramework轻量级快速开发框架提供通用类库、数据界面、通用权限管理系统,以及丰富的实例开发模板和开发文档,我们提供线上技术指导服务,助力开发团队快速搭建自己的软件项目。 WinFramework开发框架配套的核心工具 - 代码生成器,能快速生成界面(FORM)、业务层(BLL)、数据层(DAL)、模型(Model)、报表(Report)以及VS工程项http://www.csframework.com/cs-winform-framework.htm
4.C#WinForm界面如何设计更美观问答在C# WinForm界面设计中,要创建更美观且用户友好的界面,可以遵循以下建议: 选择合适的颜色方案:颜色方案对于界面的美观至关重要。选择清晰、对比度高的颜色,并确保它们在整个应用程序中保持一致。可以使用颜色选择器工具来找到适合的颜色组合。 使用布局控件:利用布局控件(如FlowLayoutPanel、TableLayoutPanel等)来组织和https://www.yisu.com/ask/35015937.html
5.C#winform分页查询的实现示例C#教程【 如果你想靠AI翻身,你先需要一个靠谱的工具!】 1、功能需求 本实例将通过c# winform实现简单的分页功能,需要的基础知识有SQL语句,c#语言基础以及c# winform的一些简单知识。 2、界面设计 这是一个简单的分页查询的界面,可以输入任意字段进行查询,这四个字段在数据准备会提到,整体界面如图1所示。 图1 中间显示https://www.jb51.net/article/210716.htm
6.C#自定义控件之winform美化「建议收藏」腾讯云开发者社区废话不多说先上一张最近写的一个小工具的效果图。 以上是工具的基本截图,在工具的制作中对窗体的自定义包括以下几点: 一、无边框拖动窗体 当设置窗体的formboderstyle为null时,系统自带的窗体拖拽属性就失效了,需要自己写这一部分。在这个工具里博主曹勇panel控件当作窗体的头部,因此实现窗体拖拽也就是实现拖拽panelhttps://cloud.tencent.com/developer/article/2084824
7.WinForm界面设计教程(C#Windows窗体应用程序)34ToolStrip介绍(上)34 ToolStrip介绍(上) 1332 播放 黑哥讲现代史 下载https://open.163.com/newview/movie/free?pid=HHHH7HARR&mid=FIAL6AOUC
8.studio可以使用C#的原生winform表单窗体设计器,相同的属性Visual Studio原生开发,无需学习,一次编译,跨平台运行. C#桌面应用程序跨平台(windows、linux、macos)界面开发组件,基于GTK组件开发,该组件的核心优势是使用C#的原生winform表单控件窗体设计器,相同的属性方法,C#原生开发即可,无需学习。一次编译,跨平台运行。 便于开发跨平台winform软件,便于将C#升级为跨平台软件。 https://portrait.gitee.com/easywebfactory/gtksystem-windows-forms
9.循序渐进开发WinForm项目(3)Winform界面层的项目设计2、业务模块的Winform界面的生成 从第一小节中可以搭建一个干净的界面项目模块,但是里面还没有任何的内容,这就需要我们进一步生成或者手工编写我们所需的界面内容了。 为了加快效率,减少界面控件名称的琐碎设置,减少对象赋值的代码编写,我们一般建议采用工具来进行界面的生成,如下界面所示。 https://www.jianshu.com/p/94bebd55015c
10.Winform桌面程序界面设计篇WinForm界面控件Telerik UI for WinForm入门指南教程 本文介绍如何在您的项目中获取Telerik UI for WinForms控件并快速开始使用它,该过程包括以下步骤: 下载控件 创建一个新的 WinForms Telerik 项目 将 Telerik 控件添加到表单 点击获取工具下载 创建一个新的 WinForms Telerik 项目 如果您没有项目,请运行Create Projehttps://www.pianshen.com/article/82362201109/
11.winform60种非常漂亮界面样式\皮肤(经典,无偿奉献)它能完全自动的为您的应用程序添加支持换肤功能,甚至不需要更改您的设计好的Form以及添加一行代码!您也不再需要花费很多时间来使得自己的应用程序更漂亮。这个程序含有80种风格 ,1500多个透明1500多个透明水晶按钮素材包水晶按钮素材包,是Winform界面美化的最好工具之一。最大的一个一个好处是全部免费。为你节约了1000https://www.iteye.com/resource/bluelight4587-8767007
12.在VisualC#中设计用户界面MicrosoftLearn在Visual C# 中,创建 Windows 应用程序用户界面 (UI) 的最方便快捷的方法是使用“Windows 窗体设计器”和“工具箱”。 说明: 本文仅讨论 Windows 窗体技术。您也可以使用 Visual C# 来创建 Windows Presentation Foundation (WPF) 应用程序。有关更多信息,请参见Windows Presentation Foundation 简介和如何:创建新的https://technet.microsoft.com/zh-cn/ms228344(v=vs.71)
13.PowerUI开发工具UI开发跨平台界面开发界面开发工具UIPower一直专注于软件界面设计、界面定制开发、界面开发工具的研发与销售,以及界面设计与开发培训服务。风靡业界的UX Designer(交互设计工具)、PS Bulider(PSD主题库工具)和DirectUI(界面开发工具),历经八年的不懈努力,只为打造卓越的界面设计和开发产品,并将这https://www.powerui.cn/
14.C#Winform控件库分享,免费开源,支持中文!(附DLL及教程)C# Winform控件包 MaterialSkin使用教程 -- 横向导航栏 https://blog.csdn.net/XX_YZDY/article/details/126536474 7.关于软件界面设计、控件颜色搭配的一些实用建议(偷懒技巧)总结 关于软件界面设计、控件颜色搭配、一些实用建议(偷懒技巧)总结——针对C# WinForm/WPF技术_XX_YYDS的博客-CSDN博客关于软件界面设计、控http://zhangshiyu.com/post/57564.html