WPF UserControl 和 CustomControl 详解
先定一个最简单的核心结论,全程不用记专业术语,普通人也能听懂:
- UserControl :拼积木 ,把WPF自带的按钮、输入框、表格拼在一起,做成一个固定模样的UI模块,样子改不了,只能拿来直接用。
- CustomControl :造模具 ,自己从零造一个全新的控件,功能固定,但外观、样式可以随便改、随便换皮肤。
一、先搞懂WPF基础前提
WPF里所有能看到的东西:按钮、文本框、窗口,本质都是控件 。
两种开发模式:
- 直接用现成控件:Button、TextBox、Label,拖过来直接用;
- 自己封装控件:就分两种,UserControl 和 CustomControl。
二、通俗类比
类比1:装修房子
- UserControl = 成品整装套餐
开发商给你装好的厨房:橱柜、灶台、水槽位置固定死,你只能用,不能改布局、不能换结构。 - CustomControl = 定制家具毛坯框架
只给你做好家具的功能结构 (比如柜子能储物),外观颜色、大小、门板样式你想怎么改就怎么改。
类比2:玩手机
- UserControl:手机自带固定桌面小组件,布局不能改,只能添加删除;
- CustomControl:万能小组件工具,功能不变,你可以自己改背景、改字体、改样式。
三、逐个拆解:什么是 UserControl
1. 怎么创建
VS里直接新建 → WPF 用户控件(UserControl),自动生成一个文件。
2. 内部做什么
你在里面拖控件、拼布局 :
放一个Grid布局,里面塞按钮、输入框、文字标签,写好点击事件、业务逻辑。
举例子:做一个登录模块,账号输入框+密码输入框+登录按钮,拼在一起。
3. 核心特点
- 长相固定 :拼好之后,放到任何窗口,长得一模一样,不能随便改内部布局;
- 不能换模板:没有自定义样式模板,别人没法改写你的内部结构;
- 开发简单:像搭积木,不用学复杂语法,新手几分钟就能做出来;
- 只能做页面模块 :适合做登录框、个人信息卡片、底部导航栏这种业务专用UI。
4. 缺点
不能定制外观、不能换肤,只能自己项目里用,没法做成通用控件给所有人用。
四、逐个拆解:什么是 CustomControl
1. 怎么创建
VS里新建 → WPF 自定义控件库(CustomControl),会自动生成:
- 一个C#逻辑代码文件
- 一个
Themes/Generic.xaml样式模板文件
2. 内部做什么
分两部分完全分离:
- C#代码 :只写功能逻辑
定义控件能做什么、有什么属性、什么事件,完全不写界面布局; - Generic.xaml :只写外观界面
用模板定义控件长什么样,边框、背景、布局都写在这里。
3. 核心特点
- 功能和界面分家:逻辑是逻辑,外观是外观,互不干扰;
- 支持随便改样式 :默认有一套外观,你可以重写模板,改成完全不一样的样子;
- 可以全局复用:做出来的控件,像系统自带的Button一样,任何项目都能用、能换肤;
- 开发稍复杂:需要懂依赖属性、控件模板,比UserControl麻烦一点。
4. 优势
可以做通用控件:自定义开关、自定义进度条、自定义表格控件,一次开发,到处用,还能随意改外观。
五、最直白的全方位对比
| 对比维度 | UserControl 拼积木 | CustomControl 造模具 |
|---|---|---|
| 制作方式 | 拖拽现有控件拼凑 | 继承控件基类,逻辑界面分开写 |
| 外观能不能改 | 不能改,固定死 | 随便改,支持换模板、换皮肤 |
| 开发难度 | 简单,新手入门 | 稍难,需要懂模板语法 |
| 复用范围 | 只能当前项目业务用 | 可以做成控件库,所有项目通用 |
| 结构灵活性 | 内部布局不能修改 | 可任意重写内部布局样式 |
| 适用场景 | 登录框、弹窗、页面模块 | 自定义开关、进度条、通用UI控件 |
六、零基础怎么选?
-
做业务页面、局部UI模块
比如:登录界面、用户卡片、表单模块、侧边栏 → 直接用 UserControl
简单、快、够用,90%的WPF业务开发都用它。
-
做通用控件、要换肤、要复用
比如:自己写一个好看的开关、环形进度条、自定义导航控件 → 用 CustomControl
做好一次,整个项目甚至多个项目都能复用,还能随时改样式。
七、一句话终极总结
- UserControl :懒人专用,拼现成控件做固定UI,省事但不能改样子;
- CustomControl :高手定制,做通用控件,功能不变,外观随便改。