static RenderElement HitTestOnPreviousChain(HitChain hitPointChain, HitChain previousChain, int x, int y) { #if DEBUG if (hitPointChain == previousChain) { throw new NotSupportedException(); } #endif if (previousChain.Count > 0) { previousChain.SetStartTestPoint(x, y); //test on prev chain top to bottom int j = previousChain.Count; for (int i = 0; i < j; ++i) { HitInfo hitInfo = previousChain.GetHitInfo(i); RenderElement elem = hitInfo.hitElement; if (elem != null && elem.VisibleAndHasParent) { if (elem.Contains(hitInfo.point)) { RenderElement found = elem.FindUnderlyingSiblingAtPoint(hitInfo.point); if (found == null) { Point leftTop = elem.Location; hitPointChain.OffsetTestPoint(leftTop.X, leftTop.Y); hitPointChain.AddHitObject(elem); //add to chain } else { break; } } } else { break; } } } //--------------------------------- if (hitPointChain.Count > 0) { var commonElement = hitPointChain.GetHitInfo(hitPointChain.Count - 1).hitElement; hitPointChain.RemoveCurrentHit(); return(commonElement); } else { return(null); } }