Browse Source

allow for pointerover control being removed from visual tree

pull/2067/head
ahopper 8 years ago
parent
commit
b515f7a30e
  1. 52
      src/Avalonia.Input/MouseDevice.cs

52
src/Avalonia.Input/MouseDevice.cs

@ -305,14 +305,41 @@ namespace Avalonia.Input
Device = device, Device = device,
}; };
while (element != null) if (element!=null && !element.IsAttachedToVisualTree)
{
// element has been removed from visual tree so do top down cleanup
if (root.IsPointerOver)
ClearChildrenPointerOver(e, root,true);
}
else
{
while (element != null)
{
e.Source = element;
e.Handled = false;
element.RaiseEvent(e);
element = (IInputElement)element.VisualParent;
}
}
root.PointerOverElement = null;
}
private void ClearChildrenPointerOver(PointerEventArgs e, IInputElement element,bool clearRoot)
{
foreach (IInputElement el in element.VisualChildren)
{
if (el.IsPointerOver)
{
ClearChildrenPointerOver(e, el, true);
break;
}
}
if(clearRoot)
{ {
e.Source = element; e.Source = element;
e.Handled = false;
element.RaiseEvent(e); element.RaiseEvent(e);
element = (IInputElement)element.VisualParent;
} }
root.PointerOverElement = null;
} }
private IInputElement SetPointerOver(IPointerDevice device, IInputRoot root, Point p) private IInputElement SetPointerOver(IPointerDevice device, IInputRoot root, Point p)
@ -361,12 +388,19 @@ namespace Avalonia.Input
el = root.PointerOverElement; el = root.PointerOverElement;
e.RoutedEvent = InputElement.PointerLeaveEvent; e.RoutedEvent = InputElement.PointerLeaveEvent;
while (el != null && el != branch) if (el!=null && branch!=null && !el.IsAttachedToVisualTree)
{ {
e.Source = el; ClearChildrenPointerOver(e,branch,false);
e.Handled = false; }
el.RaiseEvent(e); else
el = (IInputElement)el.VisualParent; {
while (el != null && el != branch)
{
e.Source = el;
e.Handled = false;
el.RaiseEvent(e);
el = (IInputElement)el.VisualParent;
}
} }
el = root.PointerOverElement = element; el = root.PointerOverElement = element;

Loading…
Cancel
Save