Пример #1
0
        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);
        }
Пример #2
0
        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);
            }
        }
Пример #3
0
        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);
                }
            });
        }
Пример #4
0
        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));
        }