public static bool IsMouseOver(this FrameworkElement element) { var x = default(int); var y = default(int); MouseHelper.GetPosition(out x, out y); DpiHelper.TransformPosition(ref x, ref y); var window = element.FindAncestor <Window>(); var result = VisualTreeHelper.HitTest(window, window.PointFromScreen(new Point(x, y))); if (result == null || result.VisualHit == null) { return(false); } if (element == result.VisualHit || element.IsAncestorOf(result.VisualHit)) { return(true); } if (result.VisualHit is Adorner adorner) { //For some reason adorners return hit tests even when IsHitTestVisible = False. //Looks like a bug to me. if (element == adorner.AdornedElement) { return(true); } } return(false); }
protected virtual void ShowContextMenu() { if (this.ContextMenu == null) { return; } var window = this.FindAncestor <Window>(); if (Windows.ActiveWindow != window) { return; } var x = default(int); var y = default(int); MouseHelper.GetPosition(out x, out y); DpiHelper.TransformPosition(ref x, ref y); this.ContextMenu.DataContext = this.DataContext; this.ContextMenu.Placement = PlacementMode.AbsolutePoint; this.ContextMenu.HorizontalOffset = x; this.ContextMenu.VerticalOffset = y; this.ContextMenu.IsOpen = true; var source = PresentationSource.FromVisual(this.ContextMenu) as HwndSource; if (source != null && source.Handle != IntPtr.Zero) { SetForegroundWindow(source.Handle); } }
protected virtual void OnMouseRightButtonUp(object sender, EventArgs e) { var task = Windows.Invoke(() => { var x = default(int); var y = default(int); MouseHelper.GetPosition(out x, out y); DpiHelper.TransformPosition(ref x, ref y); if (!object.ReferenceEquals(Menu.DataContext, this.Core)) { Menu.DataContext = this.Core; } Menu.HorizontalOffset = x; Menu.VerticalOffset = y; Menu.IsOpen = true; var source = PresentationSource.FromVisual(Menu) as HwndSource; if (source != null && source.Handle != IntPtr.Zero) { SetForegroundWindow(source.Handle); } }); }
public static bool IsMouseOver(this FrameworkElement element) { var x = default(int); var y = default(int); MouseHelper.GetPosition(out x, out y); DpiHelper.TransformPosition(ref x, ref y); var window = element.FindAncestor <Window>(); var result = VisualTreeHelper.HitTest(window, window.PointFromScreen(new Point(x, y))); if (result == null || result.VisualHit == null) { return(false); } return(element.IsAncestorOf(result.VisualHit)); }