目录

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。

  • 做法

    1. 新建一个类继承自 Control (或者 Button, TextBox)。
    2. 没有 XAML 文件对应这个类。
    3. Themes/Generic.xaml 里定义它的 StyleControlTemplate
    4. 在 Template 里用 PART_Name 来给内部部件命名(比如 PART_Track)。
  • 本质逻辑与外观分离(Lookless)

  • 场景:你要做一个通用的“圆形进度条”、“带有搜索图标的输入框”。

  • 特点

    • 不是从一个点开始画的。
    • 它的 Template 内部依然是用 Border, Path, Rectangle 这些现成的 WPF 元素拼出来的。
    • 重点:只要换个 Template,它就能从“卡车”变成“跑车”,但代码逻辑不用变。

这种“可以换皮的控件”。虽然它需要定义 Style 和 Property,但它并没有脱离 WPF 原生控件体系,它只是重新排列组合了原生绘图元素(Path/Geometry)。

第三层:Direct Rendering Control(直接渲染控件)

  • 做法

    1. 新建一个类继承自 FrameworkElementUIElement (注意:通常不继承 Control)。
    2. 重写 OnRender(DrawingContext dc) 方法。
    3. 在代码里写 dc.DrawLine(...), dc.DrawGeometry(...), dc.DrawText(...)
  • 本质直接操作视觉层(Visual Layer)

  • 场景

    • 组态软件(SCADA):几千个阀门、管道、卡车,需要极高的渲染性能。
    • 股票K线图:需要精确控制每一个像素点的绘制逻辑。
    • 复杂的示波器波形
  • 特点

    • 真的脱离了 WPF 原生控件:没有 Template,没有 Button,没有 Border,只有你画出来的线和面。
    • 最小单元:确实是点(Point)、线(Line)、几何图形(Geometry)。
    • 性能最强:因为它绕过了 WPF 繁重的布局系统(Measure/Arrange)和模板树查找。