用途:该技能面向 WPF 轻量级渲染,使用 DrawingVisual 替代较重的 Shape,适合大规模图形绘制与性能敏感场景。
主要能力:
- 视觉层级:Visual 下分 UIElement/FrameworkElement/Shape(重量级、支持事件)与 DrawingVisual(轻量、无事件、直接渲染)、ContainerVisual(分组多个 Visual)、HostVisual(跨线程 Visual)。
- DrawingVisual 与 Shape 对比:DrawingVisual 开销低、不参与布局、事件需手动实现、不支持数据绑定,适合大元素与性能关键场景;Shape 开销高、参与布局、内置事件与数据绑定,适合交互式 UI。
- 基础宿主:通过继承 FrameworkElement,重写 VisualChildrenCount 与 GetVisualChild,并用 AddVisualChild/AddLogicalChild 管理 Visual,可实现 DrawingVisualHost,并提供 AddVisual、RemoveVisual、ClearVisuals 与 GetVisualAt 命中测试。
- 创建 DrawingVisual:使用 RenderOpen 获取 DrawingContext,可绘制圆(DrawEllipse)、矩形(DrawRectangle)、文本(FormattedText + DrawText)与图像(DrawImage)。
- ContainerVisual 分组:通过 Children 添加/移除子 Visual,并可用 Offset、Transform、Opacity 整体移动、变换与设置透明度;可构建分层结构(背景层、内容层、覆盖层)。
- 命中测试:使用 VisualTreeHelper.HitTest 配合 PointHitTestParameters 做点命中,或配合 GeometryHitTestParameters 做区域命中,返回 DrawingVisual 并处理悬停与选中。
使用方式:在 WPF 项目中定义继承 FrameworkElement 的宿主控件,创建 DrawingVisual 并通过 RenderOpen 绘制,再挂载到宿主或 ContainerVisual 中;交互时通过命中测试回调获取 Visual。
适用场景:大规模图形渲染(如散点图 10,000+ 点)、分层画布、需要手动控制事件与命中测试的自定义绘制控件。
限制:DrawingVisual 不参与布局、不支持数据绑定、无内置事件,需手动实现交互;高级渲染(RenderTargetBitmap 离屏渲染与 PNG 导出、性能优化如 Freeze、StreamGeometry、DrawingGroup)在 references/advanced-rendering.md 中,资料未展开具体内容。