|
|
|
@ -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; |
|
|
|
} |
|
|
|
} |
|
|
|
} |