你想要的WinForm界面开发教程在这里 - 如何使用自定义用户控件
off999 2024-12-23 12:41 31 浏览 0 评论
DevExpress Winforms Controls 内置140多个UI控件和库,完美构建流畅、美观且易于使用的应用程序。
点击“了解更多”获取DevExpress WinForm v20.1完整版下载
在很多时候,我们做一些非常规化的界面的时候,往往需要创建一些用户控件,在其中绘制好一些基础的界面块,作为后续重复使用的一个单元,用户控件同时也可以封装处理一些简单的逻辑。在开发Winform各种类型项目,我都时不时需要定制一些特殊的用户控件,以方便在界面模块中反复使用。我们一般是在自定义的用户控件里面,添加各种各样的界面控件元素,或者封装一些特殊的函数处理共外部调用等。本篇随笔主要介绍基于DevExpress的Winform开发经验,介绍一个类似看板信息的用户控件,并在TabelLayout和StackLayout布局控件中进行展示。
一、用户控件界面的处理
在偶尔的一个场合下,看到一个牙医管家的软件界面做的非常不错,其中有一个预约列表的界面感觉非常好,如下界面所示。
其中它的每个用户信息列表里面,都是一个综合信息的展示,非常直观,估计应该是用户自定义控件做的。
在其中里面,有不同的字体,各式图标,以及内容的信息展示, 这个我在DevExpress的列表控件里面,没有看到可以如此定义列表内容的,在DevExpress的GridView里面有一个看板模板的定义有点接近,但是试了一下,可调性不好,于是放弃寻求其他接近方案,玩遍DevExpress的控件后,发现最好的方式应该是自定义用户控件的方式来解决这个界面问题。
花了一点时间,制作了一个用户控件,在其中添加一个LayoutControl方便控制布局,添加一些标签以及设置了一些图标,得到下图所示。
左侧的颜色条由于使用Group控件,因此宽度暂时无法调整,如果介意大小,我们可以在其中在创建一个LayoutControl,然后在其中方式内容即可。
我们改变布局,然后添加一个颜色块,得到类似界面如下所示。
我们来定义一下用户控件的源码部分,修改其中源码,增加对应的属性,方便动态设置用户控件的相关属性,如颜色块,项目背景色,以及绑定的对象信息等内容。
然后在界面加载完毕后,设置对应的信息和颜色信息,如下代码所示。
///
/// 窗口加载事件
///
///
///
private void UserItemControl_Load(object sender, EventArgs e)
{
BindData();
RefreshColor();
}
///
/// 根据用户定义信息,显示不同的内容
///
private void BindData()
{
if(this.UserItemInfo != null)
{
var info = this.UserItemInfo;
this.lblCustomerName.Text = info.CustomerName;
this.lblMobile.Text = info.Mobile;
this.lblReceiver.Text = info.Receiver;
this.lblRecordDate.Text = info.RecordDate;
this.lblRecordNo.Text = info.RecordNo;
this.lblDealType.Text = "";
this.lblStar.ImageOptions.ImageIndex = GetStarImageIndex(info.Stars);
if (!info.IsVip)
{
this.lblVip.Visibility = LayoutVisibility.Never;
}
}
}
///
/// 刷新背景色
///
private void RefreshColor()
{
if (ItemBlockColor != Color.Empty)
{
this.itemColor.AppearanceItemCaption.BackColor = ItemBlockColor;
}
if (ItemBackColor != Color.Empty)
{
layoutControl1.BackColor = ItemBackColor;
}
}但我们鼠标浮动在项目上或者离开的时候,或者单击某项的时候,我们变换下颜色,方便区分显示。
private void layoutControl1_MouseLeave(object sender, EventArgs e)
{
if (!this.IsSelected)
{
this.layoutControl1.ResetBackColor();
}
}
private void layoutControl1_MouseEnter(object sender, EventArgs e)
{
if (!this.IsSelected)
this.layoutControl1.BackColor = Color.FromArgb(192, 255, 192);
}
private void layoutControl1_Click(object sender, EventArgs e)
{
this.IsSelected = true;
OnItemClick?.Invoke(this, e);
}完成这些后,我们需要在窗体上对内容进行初始化。
最后我们看看界面的效果如下所示
或者下面这样的界面布局。
如果嫌弃边框红色不好看,我们 可以修改边框为灰色调一点的,这样总体看起来效果如下所示。
得到和我们最终需要的界面很接近了。
一般除了悬浮鼠标颜色变化外,控件单击后,我们会设置不同的背景色,以示区分。
///
/// 是否选中节点
///
public bool IsSelected
{
get
{
return m_IsSelected;
}
set
{
m_IsSelected = value;
this.ItemBackColor = value ? Color.FromArgb(255, 255, 192) : Color.Transparent;
this.RefreshColor();
}
}一般列表界面中,我们除了支持鼠标移动、单击变色的效果外,我们还希望支持通过键盘箭头上下键进行上下浏览项目。我们如果需要使用键盘的按键,需要设置窗体的KeyPreview属性为True,
然后跟踪按键的事件即可,如下所示。
this.KeyPreview = true;
this.KeyUp += FrmKanBan_KeyUp;按键事件捕捉处理如下所示,主要就是判断选中的用户控件,并对面板的子控件的选中效果进行处理。
private void FrmKanBan_KeyUp(object sender, KeyEventArgs e)
{
//单击鼠标或者切换按键,会触发用户控件获得selectItem对象,可以进行箭头上下移动
if (selectItem != null)
{
var panel = selectItem.Parent;
if (panel != null)
{
//获取操作项的索引值
int oldIndex = panel.Controls.IndexOf(selectItem);
if (e.KeyCode == Keys.Up)
{
if (oldIndex > 0)
{
//通过序号获得新的控件,并单击它触发选择事件
var newCtrl = panel.Controls[oldIndex - 1];
Item_OnItemClick(newCtrl, new EventArgs());
}
}
else if (e.KeyCode == Keys.Down)
{
if (oldIndex < (panel.Controls.Count - 1)) { //通过序号获得新的控件,并单击它触发选择事件 var newCtrl = panel.Controls[oldIndex + 1]; Item_OnItemClick(newCtrl, new EventArgs()); } } } } }界面中用户控件的切换选中效果,需要先清空之前所有的选择,然后在设置新的选中控件,所以还需要对控件触发单击事件进行处理,如下所示。
///
/// 选中的用户控件对象实例
///
UserItemControl selectItem = null;
///
/// 单击用户控件,触发清除所有标记后,再次设置选中的项目标记
///
private void Item_OnItemClick(object sender, EventArgs e)
{
//清空所有控件的选中标记
var panel = (PanelControl)((Control)sender).Parent;
foreach (Control ctrl in panel.Controls)
{
var item = ctrl as UserItemControl;
if(item != null)
{
item.IsSelected = false;
}
}
//设置选中控件
selectItem = ((UserItemControl)sender);
selectItem.IsSelected = true;
this.Text = selectItem.UserItemInfo.CustomerName + "-选中";
//如果在面板中遮挡,移动滚动条,可以查看到完整用户控件界面
panel.ScrollControlIntoView(selectItem);
}如下效果所示。
二、TabelLayout和StackLayout布局控件的介绍和使用
我们在做Winform开发的时候,一般知道,微软传统Winform的布局提供两个控件,FlowLayoutPanel和TableLayoutPanel,一个是流式布局,一个是表格布局,各有各的用处。流式布局主要就是按照顺序挨个放置控件,表格布局主要按照表格的定义的行列单元格,严格放置控件,表格单元格控制强度更大,而且控件具有拉伸效果。
对于DevExpress,我们一般还是倾向于采用它提供给的控件来做界面,可以很好融合它的皮肤效果,相对于Winform传统两个布局控件,DevExpress提供了两个封装效果相当的控件布局StackPanel和 TablePanel,他们的效果实现大同效果,不过调用的接口不同。
对于两个控件,我们希望里面的内容自动出现滚动条,那么设置属性AutoScroll 为True即可,如下代码所示。
panel.AutoScroll = true;而StackPanel另外需要LayoutDirection,也就是控件顺序展现的方式,如下代码所示。
panel.LayoutDirection = StackPanelLayoutDirection.TopDown;使用StackPanel面板来测试展示用户控件列表的界面代码如下所示。
///
/// 使用StackPanel对用户控件布局进行处理
///
private void InitPanel(StackPanel panel)
{
panel.AutoScroll = true;//面板自动出现滚动条
panel.LayoutDirection = StackPanelLayoutDirection.TopDown;//从上往下展示
panel.Controls.Clear();//清空界面
var list = GetInfoList(); //获取用户控件绑定的对象信息列表
for (int i = 0; i < list.Count; i++) { //定义用户控件实例 var item = new UserItemControl(); item.UserItemInfo = list[i];//绑定对象信息 item.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; item.ItemBlockColor = colors[i %10]; //变化颜色 item.OnItemClick += Item_OnItemClick;//触发选中事件 panel.Controls.Add(item); } }对于表格布局TablePanel控件来说,使用初始化控件的方式也差不多,不过有个别地方注意即可。
///
/// 使用TablePanel对用户控件布局进行处理
///
private void InitPanel(TablePanel panel)
{
panel.AutoScroll = true;//面板自动出现滚动条
panel.Controls.Clear();//清空界面
panel.Rows.Clear();//清空行
panel.Columns.Clear();//清空列
//添加列定义(增加一个列即可)
panel.Columns.Add(new TablePanelColumn(TablePanelEntityStyle.Relative, 55F));
var list = GetInfoList(); //获取用户控件绑定的对象信息列表
for (int i = 0; i < list.Count; i++) { //定义行信息 panel.Rows.Add(new TablePanelRow(TablePanelEntityStyle.AutoSize, 100F)); //定义用户控件实例 var item = new UserItemControl(); item.UserItemInfo = list[i]; //定义拉伸效果 item.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; item.ItemBlockColor = colors[i % 10]; //变化颜色 item.OnItemClick += Item_OnItemClick;//触发选中事件 //先添加控件到面板集合中 panel.Controls.Add(item); //设置控件的单元格位置 panel.SetCell(item, i, 0); } //添加多一行,确保布局 panel.Rows.Add(new TablePanelRow(TablePanelEntityStyle.AutoSize, 100F)); }添加控件的时候,需要注意下面的代码,才能正常展示控件信息,否则无法看到用户控件。
//先添加控件到面板集合中
panel.Controls.Add(item);
//设置控件的单元格位置
panel.SetCell(item, i, 0);最后对比下效果,左边是TablePanel,右边是StackPanel展现出来的效果。
以上就是界面如何在DevExpress开发中使用各种用户控件进行用户控件的创建、以及实现鼠标进入、移出、单击的不同效果,以及实现键盘上下箭头按键的事件选中效果,并介绍DevExpress中两个布局控件TabelPanel和StackPanel的正常使用,达到展示控件信息的作用。
本文转载自-伍华聪
相关推荐
- u盘突然要格式化怎么回事(用着的u盘突然要格式化)
-
U盘提示格式化的原因可能有以下几点:文件系统损坏:U盘的文件系统可能出现损坏,导致无法正常读取和写入数据。病毒感染:U盘可能被病毒感染,病毒会破坏文件系统或隐藏文件。不兼容的文件系统:U盘可能使用了一...
- 路由器pppoe怎么设置(路由器如何设置pppoe上网)
-
移动宽带PPPOE是不用设置的,你只要把帐号和密码填上其他都不选就能上网。但是要注意连接到你电脑的网线是直接经过一个路由器后连接到猫上的,因为我见过有人是这样连接的猫---路由器---路由器---电脑...
- win7桌面图标设置在哪里(win7桌面图标在哪个文件夹)
-
要调出Win7桌面图标,首先需要进入桌面。可以通过点击任务栏上方的“显示桌面”按钮或按下Windows键+D快捷键进入桌面。在桌面上右键单击空白区域,选择“个性化”,然后选择“更改桌面图标”选项。在弹...
- win7手机壁纸(windows7手机桌面主题)
-
1.首先我们打开手机进入到桌面,找到设置图标点击打开。华为手机如何设置自定义锁屏壁纸2.进入到设置界面之后,点击下方的显示选项。华为手机如何设置自定义锁屏壁纸3.然后我们就可以在显示界面中找到壁纸...
- 怎么开启路由器wifi(怎么开启路由器的dhcp功能)
-
把路由器改为开放网络方法如下:1、打开浏览器,在地址栏输入路由器网关IP地址(路由器背后的标签上有,一般是192.168.1.1),输入登录用户名和密码(一般均为admin);2、登录成功后就显示运行...
- win10加载不出来桌面黑屏(window10加载不出来)
-
方法一、如果是遇到了突发性黑屏首先尝试使用Ctrl+Alt+Delete组合键来进行电脑重启一般重启可以解决大部分黑屏故障。win10电脑黑屏按什么键恢复_win10电脑黑屏一键恢复的方法方法...
- 怎么用火绒关闭win安全中心(win10火绒安全软件怎么关闭)
-
一、火绒防火墙关闭方法在电脑上运行火绒软件后,点击首页界面的“防护中心”,在病毒防护界面可以关闭文件、U盘、邮件等保护功能,。系统防护:在该界面可以关闭系统防护功能,。网络防护:可以关闭网络保护等功...
- 微软应用商店下载手机版(微软应用商店在哪下)
-
、在桌面任务栏找到微软应用商店,点击并打开。2、进入页面后点击【应用】,进入应用页面。3、在页面里往下移动,找到热门应用,找到一个软件,点击进入。4、进入页面后,点击【安装】,软件会自动安装,安装完毕...
- win11系统怎么查看电脑配置(win11怎么查看系统版本)
-
答:win11查看电脑配置步骤如下。1.点击下方任务栏的windows图标或者按下键盘“windows键”打开开始菜单。2.在开始菜单中找到“设置”或“settings”,一般是右上角的齿轮状按钮,3...
- 麦克风没坏但是没声音(麦克风没声怎么回事)
-
几种可能性,供您参考:1、麦是完全好的(其它机子上可以用)2、插孔没有插错3、音量控制里的麦克风并没有静音掉4、声卡驱动已重装过N次,新的旧的都试过了5、音量控制→属性→录音→麦克风下面的勾...
- wps office是干什么的(wps office是干什么的可以卸载吗)
-
WPSOffice一站式办公服务平台,具有可兼容Word、Excel、PPT三大办公组件的不同格式,支持PDF文档的编辑与格式转换集成思维导图、流程图等诸多功...
- 百度网页(百度网页自动翻译怎么设置)
-
1、百度的新闻源网站太多了,基本上大型的商业门户+政府官方的媒体、机构部门都是。2、出现在【百度新闻】里的网站都是新闻源网站。3、怎么判断一个网站是不是新闻源:1)在百度新闻下直接搜网站名字,如果出现...
- 外国网站的浏览器下载(外国网站的浏览器下载Games)
-
答,可在浏览器上面下载所需要的视频/音乐的名称,下载完毕后,按所给的排列表找出所需要的视频/音乐。如果是喜欢的视频/音乐它在浏览器里边都有分类,可详细的介绍一下自己吧,还可以在古典音乐或者名著导读介绍...
-
- 京东攒机助手(京东攒机在哪)
-
自己在京东买的配置,以为身边的人能帮忙组装,但是好像超过了个人的认知,所以无奈之下只能在京东找专业人士进行安装,挺快,前一天傍晚下单,第二天上午上班就来了,组装师傅挺好,挺有耐心,业务也挺熟练,走线看起来也不错,买的机箱是师傅从来没有接触过...
-
2025-11-14 22:03 off999
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
慕ke 前端工程师2024「完整」
-
失业程序员复习python笔记——条件与循环
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
