用途:指导 WPF 控件编写过程中的决策,包括是否需要新建控件、如何选择基类,以及如何设计可样式化的控件。
主要能力: 一、判断是否需要新控件。优先考虑替代方案:仅改外观用 Style;改控件结构用 ControlTemplate;改数据展示方式用 DataTemplate;改状态行为用 Trigger;展示复合内容用 Rich Content。只有现有控件无法提供的新功能、可复用复合组件、特殊输入交互模式才需要新控件。 二、基类选择。UserControl 适合组合现有控件、快速开发、无需 ControlTemplate 定制与主题支持;Control 适合需要 ControlTemplate 定制外观、多主题支持、UI 与逻辑分离;FrameworkElement 适合无法通过简单元素组合实现外观、需通过 OnRender 直接渲染、基于 DrawingVisual 自定义合成、需要极致性能优化。 三、可样式化控件设计原则。不要严格强制模板契约,OnApplyTemplate 中若 PART 缺失应仅禁用对应功能而非抛异常,控件继续工作;区分独立、基于类型、命名三类辅助元素,如 Popup 与 ScrollViewer、ContentPresenter 与 ItemsPresenter、PART_TextBox 等。状态/行为表达优先级由高到低:属性绑定、Trigger/动画、Command、独立辅助元素、基于类型辅助元素、命名辅助元素、冒泡事件、自定义 OnRender。 四、依赖属性。支持样式、绑定、动画与动态资源需用 DependencyProperty,逻辑放在属性变更与强制值回调中,不要写在 CLR 包装器内,因为绑定会绕过包装器。 五、路由事件。用 RoutedEvent 支持冒泡、EventSetter 与 EventTrigger,通过 EventManager.RegisterRoutedEvent 注册并在 OnXxx 中 RaiseEvent。 六、自定义支持策略。高频定制项暴露为依赖属性,有时使用暴露为附加属性,极少使用则引导重定义 ControlTemplate 并配文档。 七、主题资源组织。Themes 目录下 Generic.xaml 为默认必需,可含 Aero、Luna 等主题文件;在 AssemblyInfo.cs 中设置 ThemeInfo 特性;静态构造函数中通过 DefaultStyleKeyProperty.OverrideMetadata 设置 DefaultStyleKey。
限制:资料为决策指南,未提供完整可运行示例、未说明版本或兼容性要求、未提供性能基准;部分平台与效果细节暂未提供。