internal bool InternalMouseMove(MouseEventArgs args)
{
// Children first (Order by Z-Order)
bool passive = false;
foreach (var child in Children.InZOrder())
{
args.LocalPosition = CalculateLocalPosition(args.GlobalPosition, child);
bool handled = child.InternalMouseMove(args);
passive |= handled;
args.Bubbled = handled || args.Bubbled;
}
// Ermitteln ob hovered ist (Aktive & Passive)
args.LocalPosition = CalculateLocalPosition(args.GlobalPosition, this);
bool hovered =
args.LocalPosition.X >= 0 &&
args.LocalPosition.Y >= 0 &&
args.LocalPosition.X < ActualSize.X &&
args.LocalPosition.Y < ActualSize.Y;
// Wenn sich der Hover-Status verändert hat -> Enter & Exit-Events
if ((Hovered != TreeState.None) != hovered)
{
if (hovered)
{
OnMouseEnter(args);
if (MouseEnter != null)
MouseEnter(this, args);
}
else
{
// Pressed-State abgeben
Pressed = false;
OnMouseLeave(args);
if (MouseLeave != null)
MouseLeave(this, args);
}
}
// Event für Mausbewegung
OnMouseMove(args);
if (MouseMove != null)
MouseMove(this, args);
// Hover-State neu setzen
TreeState newState = TreeState.None;
if (hovered) newState = passive ? TreeState.Passive : TreeState.Active;
Hovered = newState;
return hovered;
}