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

LoadedUnloaded

CustomControl

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!
posted on 2026-03-27 14:53  工业搬砖猿Lee  阅读(37)  评论(0)    收藏  举报