WPF-UserControl
目录
1.用户控件 (UserControl):也就是“拼界面”,为了复用一组 UI。
2.自定义控件 (Custom Control):也就是“写库”,继承 Control,写 Generic.xaml,为了做通用的 UI 组件(如 MaterialDesignInXaml 这种库)。
3.自绘元素 (Drawn Element):也就是“搞图形学”,继承 FrameworkElement 重写 OnRender,为了做 K 线图、复杂的工业仿真对象。
第一层:UserControl(用户控件)
- 做法:新建一个
.xaml和.xaml.cs,里面拖几个 Button、TextBox,拼凑成一个新的界面。 - 本质:组合(Composition)。
- 场景:页面布局、复杂的表单模块、不愿意重复写的某个业务块。
- 特点:傻瓜式,但很难换肤,复用性局限在当前项目。
第二层:Templated Control(模板化控件)
WPF 官方定义的标准 Custom Control。
-
做法:
- 新建一个类继承自
Control(或者Button,TextBox)。 - 没有 XAML 文件对应这个类。
- 在
Themes/Generic.xaml里定义它的Style和ControlTemplate。 - 在 Template 里用
PART_Name来给内部部件命名(比如PART_Track)。
- 新建一个类继承自
-
本质:逻辑与外观分离(Lookless)。
-
场景:你要做一个通用的“圆形进度条”、“带有搜索图标的输入框”。
-
特点:
- 它不是从一个点开始画的。
- 它的 Template 内部依然是用
Border,Path,Rectangle这些现成的 WPF 元素拼出来的。 - 重点:只要换个 Template,它就能从“卡车”变成“跑车”,但代码逻辑不用变。
这种“可以换皮的控件”。虽然它需要定义 Style 和 Property,但它并没有脱离 WPF 原生控件体系,它只是重新排列组合了原生绘图元素(Path/Geometry)。
第三层:Direct Rendering Control(直接渲染控件)
-
做法:
- 新建一个类继承自
FrameworkElement或UIElement(注意:通常不继承Control)。 - 重写
OnRender(DrawingContext dc)方法。 - 在代码里写
dc.DrawLine(...),dc.DrawGeometry(...),dc.DrawText(...)。
- 新建一个类继承自
-
本质:直接操作视觉层(Visual Layer)。
-
场景:
- 组态软件(SCADA):几千个阀门、管道、卡车,需要极高的渲染性能。
- 股票K线图:需要精确控制每一个像素点的绘制逻辑。
- 复杂的示波器波形。
-
特点:
- 真的脱离了 WPF 原生控件:没有 Template,没有 Button,没有 Border,只有你画出来的线和面。
- 最小单元:确实是点(Point)、线(Line)、几何图形(Geometry)。
- 性能最强:因为它绕过了 WPF 繁重的布局系统(Measure/Arrange)和模板树查找。