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; } }
void HitTestCoreWithPrevChainHint(HitChain hitPointChain, HitChain previousChain, int x, int y) { //--------------------------------- //test on previous chain first , find common element hitPointChain.ClearAll(); hitPointChain.SetStartTestPoint(x, y); //if (this.dbugId > 0 && isDragging && previousChain.Count > 1) //{ //} //RenderElement commonElement = HitTestOnPreviousChain(hitPointChain, previousChain, x, y); //temp fix //TODO: fix bug on HitTestOnPreviousChain() RenderElement commonElement = this.topRenderElement; ////use root //if (isDragging) //{ // if (commonElement != this.topRenderElement) // { // } //} //if (lastCommonElement != null && commonElement != null && // lastCommonElement != commonElement && isDragging) //{ // Console.WriteLine(commonElement.dbug_GetBoundInfo()); //} //if (commonElement == null) //{ // commonElement = this.topRenderElement; //} //if (commonElement != this.topRenderElement) //{ //} //lastCommonElement = commonElement; commonElement.HitTestCore(hitPointChain); //this.topRenderElement.HitTestCore(hitPointChain); }