WPF中CustomControl和User Control的区别
一、一句话分清
UserControl = 组合打包(快速复用)
把现有的控件(Button、TextBox、Grid)拼在一起,做成一个可复用模块。
像:登录框、搜索栏、商品卡片、设置面板。
CustomControl = 从零造控件(高度可定制)
继承自 Control,没有固定 XAML,UI 写在模板里,逻辑与界面完全分离。
像:系统自带 Button、TextBox、Slider 这种通用控件。
二、最直观对比表(背会就能用)
| 维度 | UserControl(用户控件) | CustomControl(自定义控件) |
|---|---|---|
| 本质 | 组合现有控件 | 继承 Control,全新创建控件 |
| 有无 XAML | 有自己的 xaml + cs | 只有 cs,界面写在 Themes/Generic.xaml |
| UI 与逻辑 | 耦合在一起 | 完全分离 |
| 模板可否替换 | ❌ 不能改模板 | ✅ 可任意重写模板 |
| 复用方式 | 本项目内复用 | 可做成控件库,跨项目复用 |
| 难度 | 简单,5 分钟学会 | 较难,需要理解模板机制 |
| 适用场景 | 业务 UI 模块、页面局部块 | 通用控件、换肤控件、库控件 |
| 绑定方式 | 普通属性 / 依赖属性 | 必须依赖属性 + TemplateBinding |
| 命名规范 | 无 | 必须用 PART_ 命名模板元素 |
三、深度核心区别(开发必懂)
1. 结构完全不同
UserControl
1 MyControl.xaml (界面) 2 MyControl.xaml.cs (逻辑)
界面和代码是强绑定的。
CustomControl
1 MyControl.cs (逻辑) 2 Themes/Generic.xaml (默认样式+模板)
界面和逻辑彻底分开。
2. 能不能改外观?(最大区别)
UserControl
外观写死在 XAML 里,不能改模板。
你写了一个红色按钮,用的时候就永远是红色。
CustomControl
外观在
ControlTemplate 里,可以随便替换。1 // 完全替换控件外观 2 <Style TargetType="local:MyButton"> 3 <Setter Property="Template"> 4 <ControlTemplate> 5 <!-- 全新外观 --> 6 </ControlTemplate> 7 </Setter> 8 </Style>
这就是换肤、换样式的基础。
3. 使用范围不同
UserControl
适合当前项目里的业务模块。
比如:电商项目里的 “商品卡片”。
CustomControl
适合做通用控件库。
比如:
- 带清除按钮的输入框
- 圆形头像控件
- 自定义图表控件
可以给100 个项目共用。
4. 绑定方式不同
UserControl
1 Text="{Binding ElementName=uc, Path=Title}"
CustomControl
1 Text="{TemplateBinding Title}"
5. 生命周期不同
UserControl
Loaded、UnloadedCustomControl
OnApplyTemplate()(模板应用时调用,获取界面元素)四、代码结构对比
UserControl 结构
1 <UserControl> 2 <Grid> 3 <TextBox/> 4 <Button/> 5 </Grid> 6 </UserControl>
CustomControl 结构
1 public class MyControl : Control 2 { 3 static MyControl() 4 { 5 DefaultStyleKeyProperty.OverrideMetadata( 6 typeof(MyControl), 7 new FrameworkPropertyMetadata(typeof(MyControl))); 8 } 9 }
1 <!-- Themes/Generic.xaml --> 2 <Style TargetType="local:MyControl"> 3 <Setter Property="Template"> 4 <ControlTemplate> 5 <!-- UI 在这里 --> 6 </ControlTemplate> 7 </Setter> 8 </Style>
五、最实用:你该用哪个?(超级简单判断)
用 UserControl 如果你:
- 想快速做一个可复用模块
- 界面基本固定,不需要换肤
- 是业务界面,不是通用控件
- 想简单、快、不折腾
例子:
- 登录窗口
- 搜索框
- 商品卡片
- 表单条目
- 页面头部 / 底部
用 CustomControl 如果你:
- 要做通用控件库
- 界面需要支持任意换肤、换模板
- 像系统控件一样高度灵活
- 跨项目使用
例子:
- 自定义按钮
- 自定义输入框
- 自定义开关
- 自定义图表
- 自定义进度条
六、终极总结(最简单记忆)
UserControl = 组合 = 快 = 业务模块
CustomControl = 模板 = 灵活 = 通用控件
一句话口诀
业务复用用 UserControl,通用控件用 CustomControl!
浙公网安备 33010602011771号