SuperAPI AI 工具集

implementing-hit-testing

测试与质量

查看项目

更新于 10-15 20:12

技能介绍

用途:解决 WPF 中继承自 FrameworkElement 的自定义控件在 OnRender(DrawingContext) 里直接绘制内容时,MouseLeftButtonDown、MouseMove 等鼠标事件不触发的问题。

原因:WPF 命中测试基于已渲染像素。若 OnRender 未绘制任何内容或没有背景,该区域被视为“空”,鼠标事件不会送达。

主要做法:在 OnRender 中先绘制透明背景,再绘制实际内容: dc.DrawRectangle(Brushes.Transparent, null, new Rect(0, 0, ActualWidth, ActualHeight));

关键点:Brushes.Transparent 是 Alpha 为 0 但“存在”的画刷,命中测试会成功;传 null 则失败。两者视觉上都不可见。

使用方式:可在控件内部重写 OnMouseLeftButtonDown、OnMouseMove、OnMouseLeftButtonUp 等处理事件,配合 CaptureMouse、ReleaseMouseCapture 与 InvalidateVisual 实现拖拽绘制;也可在 XAML 中挂接事件,原理相同。

注意事项:IsHitTestVisible="False" 会屏蔽事件,即使有透明背景也无效;默认值为 True。建议对 Pen、Brush 调用 Freeze() 做性能优化。常见错误是只绘制线条而无背景,此时仅线条本身可命中。

适用场景:测量/标尺覆盖层等自绘交互控件。限制:资料未提供更多平台或版本要求。