应用程序界面开发 - 自定义用户控件布局控件的使用

article/2025/11/9 16:43:27

在很多时候,我们做一些非常规化的界面的时候,往往需要创建一些用户控件,在其中绘制好一些基础的界面块,作为后续重复使用的一个单元,用户控件同时也可以封装处理一些简单的逻辑。在开发Winform各种类型项目,我都时不时需要定制一些特殊的用户控件,以方便在界面模块中反复使用。我们一般是在自定义的用户控件里面,添加各种各样的界面控件元素,或者封装一些特殊的函数处理共外部调用等。本篇随笔主要介绍基于DevExpressWinform开发经验,介绍一个类似看板信息的用户控件,并在TabelLayout和StackLayout布局控件中进行展示。

点击获取WinForm界面开发工具

一、用户控件界面的处理

在偶尔的一个场合下,看到一个牙医管家的软件界面做的非常不错,其中有一个预约列表的界面感觉非常好,如下界面所示。

Winform界面开发教程 - 自定义用户控件&布局控件的使用图集1

其中它的每个用户信息列表里面,都是一个综合信息的展示,非常直观,估计应该是用户自定义控件做的。

在其中里面,有不同的字体,各式图标,以及内容的信息展示, 这个我在DevExpress的列表控件里面,没有看到可以如此定义列表内容的,在DevExpress的GridView里面有一个看板模板的定义有点接近,但是试了一下,可调性不好,于是放弃寻求其他接近方案,玩遍DevExpress的控件后,发现最好的方式应该是自定义用户控件的方式来解决这个界面问题。

花了一点时间,制作了一个用户控件,在其中添加一个LayoutControl方便控制布局,添加一些标签以及设置了一些图标,得到下图所示。

Winform界面开发教程 - 自定义用户控件&布局控件的使用图集2

左侧的颜色条由于使用Group控件,因此宽度暂时无法调整,如果介意大小,我们可以在其中在创建一个LayoutControl,然后在其中方式内容即可。

我们改变布局,然后添加一个颜色块,得到类似界面如下所示。

Winform界面开发教程 - 自定义用户控件&布局控件的使用图集3

我们来定义一下用户控件的源码部分,修改其中源码,增加对应的属性,方便动态设置用户控件的相关属性,如颜色块,项目背景色,以及绑定的对象信息等内容。

Winform界面开发教程 - 自定义用户控件&布局控件的使用图集4

然后在界面加载完毕后,设置对应的信息和颜色信息,如下代码所示。

/// <summary>
/// 窗口加载事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void UserItemControl_Load(object sender, EventArgs e)
{
BindData();
RefreshColor();
}/// <summary>
/// 根据用户定义信息,显示不同的内容
/// </summary>
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;
}
}
}/// <summary>
/// 刷新背景色
/// </summary>
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);
}

完成这些后,我们需要在窗体上对内容进行初始化。

最后我们看看界面的效果如下所示:

Winform界面开发教程 - 自定义用户控件&布局控件的使用图集5

或者下面这样的界面布局。

Winform界面开发教程 - 自定义用户控件&布局控件的使用图集6

如果嫌弃边框红色不好看,我们 可以修改边框为灰色调一点的,这样总体看起来效果如下所示。

Winform界面开发教程 - 自定义用户控件&布局控件的使用图集7

得到和我们最终需要的界面很接近了。

一般除了悬浮鼠标颜色变化外,控件单击后,我们会设置不同的背景色,以示区分。

/// <summary>
/// 是否选中节点
/// </summary>
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());
}
}
}
}
}

界面中用户控件的切换选中效果,需要先清空之前所有的选择,然后在设置新的选中控件,所以还需要对控件触发单击事件进行处理,如下所示。

/// <summary>
/// 选中的用户控件对象实例
/// </summary>
UserItemControl selectItem = null;
/// <summary>
/// 单击用户控件,触发清除所有标记后,再次设置选中的项目标记
/// </summary>
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);
}

如下效果所示。

Winform界面开发教程 - 自定义用户控件&布局控件的使用图集8

二、TabelLayout和StackLayout布局控件的介绍和使用

我们在做Winform开发的时候,一般知道,微软传统Winform的布局提供两个控件,FlowLayoutPanel和TableLayoutPanel,一个是流式布局,一个是表格布局,各有各的用处。流式布局主要就是按照顺序挨个放置控件,表格布局主要按照表格的定义的行列单元格,严格放置控件,表格单元格控制强度更大,而且控件具有拉伸效果。

对于DevExpress,我们一般还是倾向于采用它提供给的控件来做界面,可以很好融合它的皮肤效果,相对于Winform传统两个布局控件,DevExpress提供了两个封装效果相当的控件布局StackPanel和 TablePanel,他们的效果实现大同效果,不过调用的接口不同。

Winform界面开发教程 - 自定义用户控件&布局控件的使用图集9

对于两个控件,我们希望里面的内容自动出现滚动条,那么设置属性AutoScroll 为True即可,如下代码所示。

panel.AutoScroll = true;

而StackPanel另外需要LayoutDirection,也就是控件顺序展现的方式,如下代码所示。

panel.LayoutDirection = StackPanelLayoutDirection.TopDown;

使用StackPanel面板来测试展示用户控件列表的界面代码如下所示。

/// <summary>
/// 使用StackPanel对用户控件布局进行处理
/// </summary>
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控件来说,使用初始化控件的方式也差不多,不过有个别地方注意即可。

/// <summary>
/// 使用TablePanel对用户控件布局进行处理
/// </summary>
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展现出来的效果。

Winform界面开发教程 - 自定义用户控件&布局控件的使用图集10

以上就是界面如何在DevExpress开发中使用各种用户控件进行用户控件的创建、以及实现鼠标进入、移出、单击的不同效果,以及实现键盘上下箭头按键的事件选中效果,并介绍DevExpress中两个布局控件TabelPanel和StackPanel的正常使用,达到展示控件信息的作用。

DevExpress WinForm界面控件| 下载试用

DevExpress WinForm拥有180+组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任!

本文转载自:博客园 - 伍华聪


DevExpress技术交流群4:715863792      欢迎一起进群讨论

更多DevExpress线上公开课、中文教程资讯请上中文网获取


http://chatgpt.dhexx.cn/article/T14Iyv0i.shtml

相关文章

控件

1. 自定义控件&#xff1a; 编写一个类继承自一个控件类&#xff1a; public class MyTextView extends TextView 在xml布局文件中声明控件为这种自定义的空间&#xff0c;注意一定要加上包名 <zy.qiufo.MyTextView android:id"id/tvJW" …… /> 代…

两款工控控件对比评测:Iocomp和ProEssentials

备注&#xff1a;本文章转载自慧都控件网 概述&#xff1a;使用专业的第三方控件开发漂亮逼真的工控仪表和图表是明智的选择&#xff0c;笔者对两款最好用的工控控件 Iocomp 和 ProEssentials进行了简单的对比评测。 对于程序员来说&#xff0c;要凭一己之力开发出漂亮逼真的工…

Spring Boot Actuator 使用介绍

Spring Boot Actuator 使用介绍 初识 Actuator原生端点应用配置类度量指标类 操作控制类 近期在看《Spring Cloud 微服务实战》&#xff0c;由于时间过去几年&#xff0c;对于Actuator监控端点的介绍过时&#xff0c;故作此文更新一下。 Spring Boot 版本&#xff1a;2.5.3 初识…

Activiti集成Activiti Modeler

Activiti6.0.0及以上版本与activiti-modeler的maven引用有冲突&#xff0c;解决方法参考Activiti6.0.0及以上版本集成Activiti Modeler 1.下载源文件 activiti-5.22.0官方Demo activiti5.22.0源码 2.copy源文件 &#xff08;一&#xff09;复制前端文件 解压activiti-5.22.…

【activiti】activiti入门

activiti入门 在本章内容中&#xff0c;我们来创建一个Activiti工作流&#xff0c;并启动这个流程。 创建Activiti工作流主要包含以下几步&#xff1a; 1、定义流程&#xff0c;按照BPMN的规范&#xff0c;使用流程定义工具&#xff0c;用流程符号把整个流程描述出来 2、部署…

Activiti 介绍

一、工作流 1.工作流 工作流(Workflow)&#xff0c;就是“业务过程的部分或整体在计算机应用环境下的自动化”&#xff0c;它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行&#xff0c;从而实现某个预期的业务目标&#xff0c;或…

Vuetify组件中常见的v-slot:activator=“{ on, attrs }“是什么意思?

在使用Vuetify组件时&#xff0c;常看到v-slot:activator"{ on, attrs }"以及插槽中的v-bind"attrs" v-on"on" 例如&#xff1a; 由于之前写代码时少有这种写法而且是第一次遇见&#xff0c;用久了难免想知道是什么意思。因为国内没有相关的问…

Tedddby Activator V5.1,免费绕过iOS 14.7Beta,支持iCloud登录

Tedddby Activator 是一款Windows下绕激活的工具&#xff0c;目前来说也是最好用的一款软件&#xff01; Tedddby Activator官网&#xff1a;https://tedddby.com 支持的功能 GSM两网绕过可以打电话/4G/短信/iCloud登陆/完美重启/消息推送 MEID三网游戏机绕过可以登陆iClou…

Spring Boot Actuator详解与深入应用(一):Actuator 1.x

《Spring Boot Actuator详解与深入应用》预计包括三篇&#xff0c;第一篇重点讲Spring Boot Actuator 1.x的应用与定制端点&#xff1b;第二篇将会对比Spring Boot Actuator 2.x 与1.x的区别&#xff0c;以及应用和定制2.x的端点&#xff1b;第三篇将会介绍Actuator metric指标…

springboot 集成 actuator

简介 spring-actuator做度量统计收集&#xff0c;使用Prometheus&#xff08;普罗米修斯&#xff09;进行数据收集&#xff0c;Grafana&#xff08;增强ui&#xff09;进行数据展示&#xff0c;用于监控生成环境机器的性能指标和业务数据指标。一般&#xff0c;我们叫这样的操作…

Activiti应用

1.介绍 Activiti是一个工作流引擎&#xff0c; activiti可以将业务系统中复杂的业务流程抽取出来&#xff0c;使用专门的建模语言 BPMN2.0进行定义&#xff0c;业务流程按照预先定义的流程进行执行&#xff0c;实现了系统的流程由activiti进行管理&#xff0c;减 少业务系统由…

springboot之Actuator

1、Actuator 介绍 Actuator是Springboot提供的用来对应用系统进行自省和监控的功能模块&#xff0c;借助于Actuator开发者可以很方便地对应用系统某些监控指标进行查看、统计等。 Actuator 的核心是端点 Endpoint&#xff0c;它用来监视应用程序及交互&#xff0c;spring-boo…

ActivitiListener

ActivitiListener 目录概述需求&#xff1a; 设计思路实现思路分析1.ActivitiListener2.Activity3.Gateway5.FieldExtension IOSpecification 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;sk…

SolidWorks2016软件,SW2010-2016.Activator.GUI.SSQ激活闪退解决办法:

SolidWorks2016软件&#xff0c;SW2010-2016.Activator.GUI.SSQ激活闪退解决办法&#xff1a; 解决方案&#xff1a; 原贴&#xff1a; https://xcshare.cn/other/1033.html

Actuator

1&#xff0c;简介 Actuator’ ktʃʊˌeɪtə是 Spring Boot 提供的对应用系统的自省和监控的 集成功能&#xff0c;可以对应用系统进行配置查看、相关功能统计等。在 Spring Cloud 中主要是完成 微服务的监控&#xff0c;完成监控治理。可以查看微服务间的数据处理和调用&…

Spring boot——Actuator 详解

一、什么是 Actuator Spring Boot Actuator 模块提供了生产级别的功能&#xff0c;比如健康检查&#xff0c;审计&#xff0c;指标收集&#xff0c;HTTP 跟踪等&#xff0c;帮助我们监控和管理Spring Boot 应用。 这个模块是一个采集应用内部信息暴露给外部的模块&#xff0c…

Spring Boot Actuator详解

Actuator简介 什么是Spring Boot Actuator&#xff1f; Spring Boot Actuator 模块提供了生产级别的功能&#xff0c;比如健康检查&#xff0c;审计&#xff0c;指标收集&#xff0c;HTTP跟踪等&#xff0c;帮助我们监控和管理Spring Boot应用。这个模块是一个采集应用内部信…

C# 反射之Activator用法举例

概述 程序运行时&#xff0c;通过反射可以得到其它程序集或者自己程序集代码的各种信息&#xff0c;包括类、函数、变量等来实例化它们&#xff0c;执行它们&#xff0c;操作它们&#xff0c;实际上就是获取程序在内存中的映像&#xff0c;然后基于这个映像进行各种操作。 Acti…

将IPA放到服务器提供下载

2015年12月15日 09:45:16 LC_畅 阅读数&#xff1a;3696 &#xff0a; 上传到服务器我们需要两个文件&#xff0c;一个ipa和一个 plist文件 &#xff0a; 注意plist文件和ipa包的名字必须要相同&#xff08;最好取名英文&#xff09; 第一步&#xff1a;把ipa文件放到你们服务…

ipa文件包获取服务器地址,iOS获取App ipa包以及资源文件

要获得线上APP的ipa文件&#xff0c;现在有以下几种方案 1.通过PP助手下载安装到手机的应用 2.通过iTools助手下载安装到手机的应用 3.通过Apple Configurator 2(Mac商店)获取 前两种方案网上的教程很多&#xff0c;这里只介绍第三种方案 首先 去Mac上的App Store下载Apple Con…