在上一節中,我們已經建立了 HitFilter 與 HitResult 兩個回呼方法,它們是 VisualTreeHelper.HitTest 控制流程的核心。每次命中測試執行完畢後,必須呼叫 HitTestResultBehavior.Continue 才能繼續向視覺樹更深層遞迴搜尋。
public HitTestResultBehavior HitResult(HitTestResult result)
{
return HitTestResultBehavior.Continue;
}
HitFilter 負責篩選命中物件,HitResult 則決定是否繼續遞迴。兩者定義完成後,便可在視窗的滑鼠移動事件中執行實際的命中測試:
private void Window_MouseMove(object sender, MouseEventArgs e)
{
SpiritList.Clear();
Point p = e.GetPosition(CarrIEr);
VisualTreeHelper.HitTest(
CarrIEr,
new HitTestFilterCallback(HitFilter),
new HitTestResultCallback(HitResult),
new PointHitTestParameters(p));
if (SpiritList.Count > 0)
{
for (int i = 0; i < SpiritList.Count; i++)
{
if (isEfficaciousSection(SpiritList[i].EfficaciousSection, e.GetPosition(SpiritList[i])))
{
this.Cursor = Super.getCursor(1);
label3.Content = SpiritList[i].Name; // 除錯用
break;
}
else
{
this.Cursor = Super.getCursor(0);
}
}
}
}
每次滑鼠移動時,必須先清空精靈容器 SpiritList,然後取得滑鼠在載體 CarrIEr 中的座標,以此為參數發起點擊測試。經過 HitFilter 與 HitResult 過濾後,所有位於滑鼠位置的精靈會被收集進容器。接著遍歷容器內的每個精靈,只有當該點真正落在精靈 Canvas 的有效實體區域內,才算成功捕獲。一旦捕獲,立即將滑鼠游標切換為 1 號(發光游標)並跳出迴圈。這裡透過 label3 顯示捕獲到的精靈名稱,方便驗證準確度。
在地圖密集區域放置 30 個擁有不同名稱的怪物精靈,移動滑鼠分別捕獲,label3 顯示的名稱與滑鼠所指精靈完全一致。此方法實現極其精確高效,堪比衛星定位:

至此,完整的 HitTest 精準捕獲精靈流程已告一段落。下一節將進入戰鬥系統的建構,敬請期待。