瀏覽代碼

Implement input hit testing on top of visual layer.

Steven Kirk 9 年之前
父節點
當前提交
3c4b8cdf90
共有 1 個文件被更改,包括 7 次插入53 次删除
  1. 7 53
      src/Avalonia.Input/InputExtensions.cs

+ 7 - 53
src/Avalonia.Input/InputExtensions.cs

@@ -25,28 +25,7 @@ namespace Avalonia.Input
         {
             Contract.Requires<ArgumentNullException>(element != null);
 
-            if (element.IsVisible &&
-                element.IsHitTestVisible &&
-                element.IsEnabledCore)
-            {
-                bool containsPoint = BoundsTracker.GetTransformedBounds((Visual)element).Contains(p);
-
-                if ((containsPoint || !element.ClipToBounds) && element.VisualChildren.Any())
-                {
-                    foreach (var child in ZSort(element.VisualChildren.OfType<IInputElement>()))
-                    {
-                        foreach (var result in child.GetInputElementsAt(p))
-                        {
-                            yield return result;
-                        }
-                    }
-                }
-
-                if (containsPoint)
-                {
-                    yield return element;
-                }
-            }
+            return element.GetVisualsAt(p, IsHitTestVisible).Cast<IInputElement>();
         }
 
         /// <summary>
@@ -60,38 +39,13 @@ namespace Avalonia.Input
             return element.GetInputElementsAt(p).FirstOrDefault();
         }
 
-        private static IEnumerable<IInputElement> ZSort(IEnumerable<IInputElement> elements)
+        private static bool IsHitTestVisible(IVisual visual)
         {
-            return elements
-                .Select((element, index) => new ZOrderElement
-                {
-                    Element = element,
-                    Index = index,
-                    ZIndex = element.ZIndex,
-                })
-                .OrderBy(x => x, null)
-                .Select(x => x.Element);
-        }
-
-        private class ZOrderElement : IComparable<ZOrderElement>
-        {
-            public IInputElement Element { get; set; }
-            public int Index { get; set; }
-            public int ZIndex { get; set; }
-
-            public int CompareTo(ZOrderElement other)
-            {
-                var z = other.ZIndex - ZIndex;
-
-                if (z != 0)
-                {
-                    return z;
-                }
-                else
-                {
-                    return other.Index - Index;
-                }
-            }
+            var element = visual as IInputElement;
+            return element != null &&
+                   element.IsVisible &&
+                   element.IsHitTestVisible &&
+                   element.IsEnabledCore;
         }
     }
 }