-
2021-03-14 21:44:55
项目中需要实现这样一个功能,用winform做一个客户端软件,首页上有4个模块(通过4个panel实现),这4个模块需要通过配置来动态显示其中的一个或多个,很显然我们都知道这有2的4次方,也就是16种组合,去掉一种0的状态,也就是15种排列方式。
假设这4个模块分别为A、B、C、 D
那15种组合就是:A,B,C,D,AB,AC,AD,BC,BD,CD,ABC,ABD,ACD,BCD,ABCD
方法一:
我们把这15种排列一个一个罗列出来,这样简单明了,不会把自己绕进去,就是需要写15个
if
而已,具体就不写了方法二:
允许一定程度的
if
嵌套,什么程度呢,只要不把自己绕进去就行了,我选择了这种方式。涵盖A、AB、AC、AD这几种组合
if(A){ A.Visible = true; A.Location = new Point(a1,a2); if(B && !C && !D){ B.Visible = true; B.Location = new Point(b1,b2); }else if(!B && C && !D){ C.Visible = true; C.Location = new Point(c1,c2); }else if(!B && !C && D){ D.Visible = true; D.Location = new Point(d1,d2); } }
涵盖B、BC、BD
if(!A && B){ B.Visible = true; B.Location = new Point(b1,b2); if(C && !D){ C.Visible = true; C.Location = new Point(c1,c2); }else if(!C && D){ D.Visible = true; D.Location = new Point(d1,d2); } }
涵盖C、CD
if(!A && !B && C){ C.Visible = true; C.Location = new Point(c1,c2); if(D){ D.Visible = true; D.Location = new Point(d1,d2); } }
D
if(!A && !B && !C && D){ D.Visible = true; D.Location = new Point(d1,d2); }
ABC
if(A && B && C && !D){ A.Visible = true; A.Location = new Point(a1,a2); B.Visible = true; B.Location = new Point(b1,b2); C.Visible = true; C.Location = new Point(c1,c2); }
ABD
if(A && B && !C && D){ A.Visible = true; A.Location = new Point(a1,a2); B.Visible = true; B.Location = new Point(b1,b2); D.Visible = true; D.Location = new Point(c1,c2); }
ACD
if(A && !B && C && D){ A.Visible = true; A.Location = new Point(a1,a2); C.Visible = true; C.Location = new Point(b1,b2); D.Visible = true; D.Location = new Point(c1,c2); }
BCD
if(!A && B && C && D){ B.Visible = true; B.Location = new Point(a1,a2); C.Visible = true; C.Location = new Point(b1,b2); D.Visible = true; D.Location = new Point(c1,c2); }
ABCD
if(A && B && C && D){ A.Visible = true; A.Location = new Point(a1,a2); B.Visible = true; B.Location = new Point(a1,a2); C.Visible = true; C.Location = new Point(b1,b2); D.Visible = true; D.Location = new Point(c1,c2); }
这样就相当于用了9个大判断实现了功能,又在比较容易理解的范围内。
不过我相信肯定还有更简洁易懂的方法。更多相关内容 -
WinForm页面布局 控件
2012-10-28 18:04:47留着以后自己用,如果大家发现不好用的地方 记得留言 -
MFC布局管理,模仿Winform布局控件
2015-03-14 22:08:34仿C#的TableLayoutPanel封装的MFC布局管理类,方便MFC界面控件布局,刚学MFC时做的,不是很全,只可以作为参考 -
winform布局、控件
2020-11-10 21:05:08// 设计界面,将控件水平或垂直居中 - 选中控件 - 菜单,格式,窗体内居中,水平对齐 // 调整控件z序 - 选中控件 - 右键,“置于顶层”、“置于底层” 2. 图标查找 icons8客户端 支持png、ico、xaml等图标搜索 ...1. Visual Studio设计界面
- 设计界面,将控件水平或垂直居中
- 选中控件 - 菜单,格式,窗体内居中,水平对齐
- 调整控件z序
- 选中控件 - 右键,“置于顶层”、“置于底层”
2. 图标查找
- 支持png、ico、xaml等图标搜索
- 支持修改图标大小、颜色
- 无需登录,可以像拖动文件一样拖动图标
3. 布局
- 整体界面采用Panel+Dock进行分块布局
// 标题栏 panel1.Dock=Top // 左侧工具栏栏 panel2.Dock=Left // 主内容区 panel3.Dock=Fill
- 控件保持水平、垂直居中
panel1.Anchor=None
4. 配色
- 前景色:白色
- 背景色可选:Crimson 深红、SeaGreen 海绿色、RoyalBlue 宝蓝色
5. 自定义窗体
// 无边框 FormBorderStyle=None // 缩放模式 AutoScaleMode=None // 字体、前景色、背景色 Font、ForeColor、BackColor
6. 自定义边框
// 4个panel,Dock属性分别为左、上、右、下 // panel背景色为边框色 panel1.Dock=Left panel1.Widht=5 panel2... panel3... panel4...
7. 图片+文字按钮
// 扁平样式 button1.FlatStyle=Flat // 去除边框 button1.FlatAppearance.BorderSize=0 // 文字颜色 button1.ForeColor=White // 背景色 button1.BackColor=RoyalBlue // 图片 button1.Image=xxx.png // 图片放在文字前面 button1.TextImageRelation=ImageBeforeText
8. 图片按钮
“图片+文字按钮”的基础上去除文字内容
9. 圆点样式密码框
textBox1.UseSystemPasswordChar=true
-
WinForm布局之控件分层
2019-05-20 13:30:29Winform中布局时Dock是最常用的设置,尤其是对于需要拉伸的区域要设为Fill,有时会遇到同级控件设为相同的Dock属性值时,布局先后的问题。 比如,左边LeftPanel是用于主数据成图显示的区域,要支持拉伸,设为了...1、 问题描述
Winform中布局时Dock是最常用的设置,尤其是对于需要拉伸的区域要设为Fill,有时会遇到同级控件设为相同的Dock属性值时,布局先后的问题。
比如,左边LeftPanel是用于主数据成图显示的区域,要支持拉伸,设为了Fill,右边是可选拉伸的视图区域RightPanel,设为了Right,现在要用Spliter用于分割和调整两个Panel的区域,按理应当位于二者之间,而且应当设置其Dock为Right,以保证主视图的正常缩放,而Splliter和RightPanel都设为Right停靠时,谁在前,谁在后呢?
2、理论说明
显然,我们希望右停靠的时候,先让RightPanel停靠在最右边,然后再让Spliter向右停靠在RightPanel的左侧,于是,这里就涉及到一个控件的层级关系问题:
越底层的控件会优先布局,上层的控件需要在底层控件布局的基础上再进行布局!
3、解决方案
因此,要达到题目要求的效果,就要将RightPanel置于Spliter的底层,具体的层级关系可以通过"视图》其他窗口》文档大纲"进行查看,越底层的越先布局,所以,布局顺序需要从下往上看。
我们能够看到,panel2在splitter1的更底层,所以panel2先于splitter1布局停靠在最右侧,而panel3在splitter2的更底层,所以panel3先于splitter2布局停靠在最下侧,利用这种层级关系,我们可以调整完成各种常见的布局效果,尤其是在面对控件缩放问题时。
-
C#Winform中控件的布局思想
2021-01-10 10:31:08windows窗体应用程序的控件都派生自Control类,并继承了许多通用成员,下面介绍Control类的一些基本特征,了解这些能够大致知道控件是如何实现在窗体中布局的。 Achor 指示在控件的容器被调整时,控件紧贴着哪个...windows窗体应用程序的控件都派生自Control类,并继承了许多通用成员,下面介绍Control类的一些基本特征,了解这些能够大致知道控件是如何实现在窗体中布局的。
Achor 指示在控件的容器被调整时,控件紧贴着哪个方向的边沿,例如在一个窗口中放置一个按钮,并将按钮的Anchor属性设置为Right+Bottom,当用户调整窗口的大小时,按钮将保持与窗口的底部和右边沿的距离不变 ForeColor、BackColor ForeColor属性表示前景色,即控件上呈现的文本的颜色;BackColor属性表示控件的背景色 Dock 指示控件如何填充容器中的可用空间,如果设置为FILL则表示控件将占满所有的可用空间;如果设置为TOP,则表示控件将占用容器上方的所有空间 Location与Left、Top 表示控件在容器中的位置、如果控件是窗口,那么它的位置就相当于桌面坐标(屏幕坐标)。由于Location属性是Point结构,是值类型,因此不应该直接修改其X和Y的值,而是向Location属性赋予一个新的Point实例;叶可以直接设置Left(x坐标)属性和Top(y坐标)属性的值来调整控件的位置,例:Point p2 = new Point(20, 30); pictureBox1.Location = p2 Size和Width、Height 表示控件的大小,由高度和宽度两个值决定。Size类型是Size结构,是值类型,不能直接修改,必须将一个新的Size实例赋值给Size属性,或者直接修改控件的Width和Height属性,例如:控件名.Size=new Size(高度,宽度) 调整控件的Z顺序
当窗口或容器控件中的控件在布局过程中发生重叠的时候,会出现层次性。Z顺序较大的控件会遮挡Z顺序较小的控件,即放在顶层的控件会挡住放在底层的控件。
1.设计人员可以在设计阶段通过窗体设计器来调整控件的Z顺序,右击—【置于顶层】/【置于底层】。
2.可以在运行阶段动态改变控件的Z顺序。操作方式是左击时增加控件的Z顺序,右击时减少控件的Z顺序。同时,为了让读者可以清晰的观察到控件的布局变化,可以分别处理他们的Point事件(Control.Point控件重绘)。
可以试试下面这段代码,分别增加label1,label2,label3.体会它的变化public Form1() { InitializeComponent(); label1.Paint += label1_Paint; label2.Paint += label2_Paint; label3.Paint += label3_Paint; label1.MouseClick += OnLabelMouseClick; label2.MouseClick += OnLabelMouseClick; label3.MouseClick += OnLabelMouseClick; } private void OnLabelMouseClick(object sender, MouseEventArgs e)//此为共享事件处理程序 { Control c = sender as Control; if(e.Button==System.Windows.Forms.MouseButtons.Left) { c.BringToFront();//增加Z顺序 } if (e.Button == System.Windows.Forms.MouseButtons.Right) { c.SendToBack();//减少Z顺序 } } private void label3_Paint(object sender, PaintEventArgs e) { Label lb = sender as Label;//是事件源,表示触发事件的那个组件 Pen pen = new Pen(Color.Blue, 15f);//用于绘制边框的笔 e.Graphics.DrawRectangle(pen, new Rectangle(0, 0, lb.Width, lb.Height)); pen.Dispose();//释放Pen对象 } private void label2_Paint(object sender, PaintEventArgs e) { Label lb = sender as Label;//是事件源,表示触发事件的那个组件 Pen pen = new Pen(Color.Red, 15f);//用于绘制边框的笔 e.Graphics.DrawRectangle(pen, new Rectangle(0, 0, lb.Width, lb.Height)); pen.Dispose();//释放Pen对象 } private void label1_Paint(object sender, PaintEventArgs e) { Label lb = sender as Label;//是事件源,表示触发事件的那个组件 Pen pen = new Pen(Color.Yellow, 15f);//用于绘制边框的笔 e.Graphics.DrawRectangle(pen, new Rectangle(0, 0, lb.Width, lb.Height)); pen.Dispose();//释放Pen对象 }
控件的Anchor属性、Dock属性--影响布局
在设计窗体时,这两个属性特别有用,如果用户认为改变窗口的大小并不容易,应确保窗口看起来显示的不是那么乱,并编写很多代码来实现这个效果,许多程序解决这个问题都是禁止给窗口重新设置大小
这显然是解决问题的最简单的方法,但不是最好的方法,因此引入了Anchor和Dock属性。1、Anchor属性用于指定在用户重新设置窗口的大小时控件应该如何响应,可以指定如果控件重新设置了大小,就根据控件的边界去锁定它,或者其大小不变,但根据窗口的边界来锚定它的位置
正如名称暗示的那样,这个属性迫使控件将其自身定位在父窗体或父控件中某个相对或绝对位置,这个属性有四个可以开启或关闭的值
* Top--表示控件中与父窗体(父控件)相关的顶部应该保持固定
* Bottom--表示控件中与父窗体(父控件)相关的底部应该保持固定
* Left--表示控件中与父窗体(父控件)相关的左边缘应该保持固定
* Right--表示控件中与父窗体(父控件)相关的右边缘应该保持固定
正如演示的那样,每个控件在父窗体上都自动的保持它的位置,需要注意的是:
①如果没有指定一个控件有左右锚定,它将在父窗体中保留一个相对左右的位置,其它也是一样
②如果选择了所有Anchor值的控件,控件只是在调整父窗体大小时,随着增大和缩小--与窗体的边缘比较起来它的所有边缘保持静止不变。
2、Dock属性用于指定控件应该停放在窗口的边框上,用户重新设置了窗口的大小,这个控件将继续停放在窗口的边框上,例如,如果指定控件停留在窗口的底部边界上,则无论窗口的大小怎么改变,这个控件都将改变大小,或移动其位置,确保总是位于屏幕的底部。
Dock属性迫使控件紧贴父窗体的某个边缘。虽然Anchor属性也可以实现这一点,但是Dock属性使得能够在父窗体中让子窗体可以再上方(或旁边)互相堆叠,如果某个子窗体改变了大小,其它停驻在它旁边的子窗体也会随之改变。和Anchor属性不同的是,可以将Dock属性设置为一个单值:
*Top--迫使控件位于父窗体(或控件)的顶部,如果有同一个父窗体的其它子控件也被设置为停驻在顶部的话,那么控件将在彼此上方互相堆叠
* Bottom--迫使控件位于父窗体(或控件)的底部,如果有同一个父窗体的其它子控件也被设置为停驻在底部的话,那么控件将在彼此上方互相堆叠
* Left--迫使控件位于父窗体(或控件)的左边,如果有同一个父窗体的其它子控件也被设置为停驻在左边的话,那么控件将在彼此旁边互相堆叠
* Right--迫使控件位于父窗体(或控件)的右边,如果有同一个父窗体的其它子控件也被设置为停驻在右边的话,那么控件将在彼此旁边互相堆叠
* Fill--迫使控件位于父窗体(或控件)的上方,如果有同一个父窗体的其它子控件也被设置为停驻在上方的话,那么控件将在彼此上方互相堆叠
* None--表示控件将会正常运转
需要注意的是:对于Dock属性,添加控件的顺序会影响它们停驻的方式。窗体控件 布局 属性
布局
AutoScaleMode:当屏幕分辨率或字体发生改变时,窗体和控件是如何发生变化的。
- None : 禁用自动缩放。(默认时)
- Font :根据类使用的字体(通常为系统字体)的维度控制缩放。如果希望控件或窗体根据操作系统中字体的大小进行拉伸或缩小,则按 Font 缩放十分有用,如果控件或窗体的绝对大小无关紧要,则应使用这种方式进行缩放。比如:一个按钮的文字,改变了系统的字体大小,按钮也随着变大到能完整显示文字。例子:新建一个winform,字体为 ‘宋体 9pt’,上面还有一个button,用来参考,然后,先改变winform的字体大小,就改为‘宋体 16pt’吧。这时候,连按钮都变大了。
- Dpi : 根据显示分辨率控制缩放。常用分辨率为 96 和 120 DPI。如果要相对于屏幕确定控件或窗体的大小,则按 Dpi 缩放十分有用。例如,对于显示图表或其他图形的控件,可能希望使用每英寸点数 (DPI) 缩放,以便该控件始终占据一定百分比的屏幕
- Inherit : 根据类的父类的缩放模式控制缩放。如果不存在父类,则禁用自动缩放。
AutoScroll:只是当控件内容大于它的可见区域时是否自动显示滚动条。
- TRUE—是
- FALSE—否
AutoSize:指定控件是否自动调整自身的大小以适应其内容的大小。
- TRUE—是
- FALSE—否
AutoSizeMode:指定用户界面元素自动调整自身大小的模式。
- GrowOnly—生成的窗体可以用鼠标调节大小
- GrowAndShrik—生成的窗体不可以用鼠标调节大小
Anchor:定义某个控件绑定到的容器的边缘,当控件锚定到某个边缘时,与指定边缘最接近的控件边缘与指定边缘之间的距离将保持不变。
-Top——表示控件中与父窗体(或父控件)相关的顶部应该保持固定(Anchor相当于是将控件钉在了父控件上,不管父控件怎么放大缩小,它与父控件边缘距离都将保持绝度距离不变)
- Bottom——表示控件中与父窗体(或父控件)相关的底边应该保持固定
- Left——表示控件中与父窗体(或父控件)相关的左边缘应该保持固定
- Right——表示控件中与父窗体(或父控件)相关的右边缘应该保持固定
- None——漂浮
Dock:用于指定控件应停放在窗口的边框上,用户重新设置了窗口的大小,这个控件将继续停放在窗口的边框上,例如,如果指定控件停放在窗口的底部边界上,则无论窗口的大小改变,这个控件都将改变大小,或移动其位置,确保总是位于屏幕的底部。虽然Anchor属性也可以实现这一点,但是dock属性使得你能够在父窗体中让子窗体可以在上方(或旁边)互相“堆叠”。
- Top——迫使控件位于父窗体(或控件)的顶部。如果有同一个父窗体的其它子控件也被设置为停驻在顶部的话,那么控件将在彼此上方相互堆叠。
- Bottom——迫使控件位于父窗体(或控件)的底部。如果有同一个父窗体的其它子控件也被设置为停驻在底部的话,那么控件将在彼此上方相互堆叠。
- Left——迫使控件位于父窗体(或控件)的左边。如果有同一个父窗体的其它子控件也被设置为停驻在左边的话,那么控件将在彼此旁边相互堆叠。
- Right——迫使控件位于父窗体(或控件)的右边。如果有同一个父窗体的其它子控件也被设置为停驻在右边的话,那么控件将在彼此旁边相互堆叠。
- Fill——迫使控件位于父窗体(或控件)的上方。如果有同一个父窗体的其它子控件也被设置为停驻在上方的话,那么控件将在彼此上方相互堆叠。
- None——表示控件将会正常运转。窗口样式
MaximizeBox:确定窗体标题栏的右上角是否有最大化框。
- TRUE—是
- FALSE—否 -
C# WinForm 控件拖动 (支持网格线对齐)
2021-08-11 09:51:01一个高级的 WinForm 控件拖动示例。他的不同之处在于拖动时可以使控件与网格线对齐,还可以设置是否显示控件内容。非常值得学习和借鉴!(本资源为原创,别的地方找不到的哦!) -
winform上控件的拖拽
2017-08-11 11:49:36控件拖动 不拉出对话框 坐标转换 winform 拖拽 VS2010 编译通过 -
WinForm 布局控件“WeifenLuo.WinFormsUI.Docking“的使用
2020-07-14 21:43:40本篇介绍Winform程序开发中的布局界面的设计,介绍如何在我的共享软件中使用布局控件"WeifenLuo.WinFormsUI.Docking"。 布局控件"WeifenLuo.WinFormsUI.Docking"是一个非常棒的开源控件,用过的人都深有体会,该... -
仿VS布局的WinformUI控件
2019-05-08 19:16:23最新的DockPanel组件,仿Visual Studio风格,支持多种主题切换,VS2003 、2005、2012、/2013/2015等多套主题风格 -
winform DevExpress强大控件布局 C# 综合系统 全部源码和数据库
2014-12-01 13:58:49winform DevExpress强大控件布局 C# 综合系统 界面非常美观、无需修改即可使用 全部源码和数据库 本人亲自测试过 没有任何问题 大家一起学习 -
DockPanel 能够实现像vs一样布局的winform控件
2017-08-15 16:30:31DockPanel 能够实现像vs一样布局的winform控件 -
c#Winform布局界面(使用容器控件)
2021-04-15 20:40:45容器控件: 容器控件1:面板Panel 属性: AutoScroll属性,设置面板滚动条是否可用,默认情况下是禁用false BorderStyle属性,设置面板边框风格,有None(默认),FixedSingle,...容器控件3:表格布局控件TableLayou -
WinForm常用控件
2020-05-19 23:13:55目录一 关闭最小化二 退出程序接口三 最小化或关闭时隐藏到系统托盘1 添加托盘图标控件NotifyIcon2 添加(重写)窗口尺寸变动函数Form1_Resize3 添加(重写)关闭窗口事件4 添加双击托盘图标事件(双击显示窗口)5 添加... -
WinForm 常用控件
2021-01-23 15:21:171.按钮控件【Button】 1.1 属性(F4) ...BackgroundImageLayout:背景图片布局 Zoom:居中 Stretch:全填充 ContextMenuStrip:右键菜单 & -
winform 导航控件的使用
2013-04-09 16:03:54代码先简单,主要是写WeifenLuo.WinFormsUI.Docking.dll导航的使用,程序直接运行能看出效果! -
通过隐藏WinForm上很少使用或无关紧要的控件来节省宝贵的屏幕空间
2021-04-08 21:31:37在任何WinForm中,都必须有对用户可用但始终不可见的控件。 一种聪明的方法是隐藏这些控件,并仅在用户要求时显示它们。 WinForm可以较小,这样可以节省屏幕空间。 -
C#Winform中控件的布局总结篇,包含Z顺序的介绍
2020-01-08 14:56:41windows窗体应用程序的控件都派生自Control类,并继承了许多通用成员,下面介绍Control类的一些基本特征,了解这些能够大致知道控件是如何实现在窗体中布局的。 Achor 指示在控件的容器被调整时,控件紧贴着哪个... -
WinForm界面布局控件WeifenLuo.WinFormsUI.Docking
2014-09-05 10:31:09WeifenLuo.WinFormsUI.Docking是WinForm的一种开源界面布局控件简单易用, 用过的人都深有体会,该控件之强大、美观、不亚于商业控件。而且控件使用也是比较简单的。先看看控件使用的程序界面展示效果。 -
WinForm界面开发之布局控件WeifenLuo.WinFormsUI.Docking.zip
2021-02-22 23:03:09第三方开源框架 -
【自定义控件】c#winform自定义控件实现标签控件
2022-03-22 01:14:02介绍首先我们设计这个控件的时候要明白控件是怎样交互的, 熟悉b站的小伙伴应该知道 ,我们上传视频的时候会去选择标签 ,我们输入标签文本 按下回车就代表该标签已经添加成功了,效果图如下!控件... -
在Winform界面使用自定义用户控件及TabelPanel和StackPanel布局控件
2021-03-07 16:42:44在开发Winform各种类型项目,我都时不时需要定制一些特殊的用户控件,以方便在界面模块中反复使用。我们一般是在自定义的用户控件里面,添加各种各样的界面控件元素,或者封装一些特殊的函数处理共外部调用等。本篇... -
在winform下实现左右布局多窗口界面的方法
2020-12-25 23:10:06在web页面上我们可以通过frameset,iframe嵌套框架很容易实现各种导航+内容的布局界面,而在winform、WPF中实现其实也很容易,我这里就分享一个:在winform下实现左右布局多窗口界面。 我这里说的多窗口是指一个父... -
Winform分页控件之纯分页显示处理
2021-01-11 22:21:55在之前介绍的Winform分页控件中,都以分页控件+显示表格控件作为一个整体性的控件,不可分开,这样做的目的是可以实现更多的操作,集成更多丰富的特性,减少我们开发的工作量,这种情况虽然适用于大多数的情况,不过... -
Net Core3.1,.Net 5框架的C#WinForm开源控件库,工具类库,扩展类库,多页面开发框架
2021-03-18 20:30:42SunnyUI.Net,基于C#.Net WinForm开源控件库,工具类库,扩展类库,多页面开发框架 原始码编译环境:VS2019 动态库应用环境:VS2010及以上,.Net Framework 4.0及以上(不包括.Net Framework 4 Client Profile),.... -
深入分析C#中WinForm控件之Dock顺序调整的详解
2020-12-31 09:10:19最近被.net winform中的控件布局搞困惑了,由于控件都是使用Dock方式的,操作起来也是比较方便,如果最大化,窗口大小调整等,都可以随着窗口大小的变化而变化。但问题是,.net winform的dock方式是根据先添加的控件... -
WinForm中常用控件
2020-08-21 17:47:02公共控件 一、Button:按钮 按钮是一种非常常见的控件,任何需要在界面点击然后进行下一步操作的行为都可以使用按钮来完成。 使用:QQ的登录按钮 常用属性: Enable:设置按钮是否可以点击,常用于步骤... -
使用xml 进行winform控件布局的保存
2019-10-23 16:12:581、使用weifenluo控件 using WeifenLuo.WinFormsUI.Docking; using System.IO; 2.关闭事件,将空间布局使用xml格式进行保存 private void main_FormClosing(object sender, FormClosingEventArgs e) { Mes... -
winform VS窗口布局的框架 灵活拖拽布局
2013-03-22 09:52:44winform 防VS窗口布局的框架 可非常灵活的拖拽修改布局