/// <summary> /// Show context menu over given control. /// </summary> /// <param name="parent">Parent control to attach to it.</param> /// <param name="location">Popup menu origin location in parent control coordinates.</param> public virtual void Show(Control parent, Vector2 location) { Assert.IsNotNull(parent); // Ensure to be closed Hide(); // Peek parent control window var parentWin = parent.RootWindow; if (parentWin == null) { return; } // Check if show menu inside the other menu - then link as a child to prevent closing the calling menu window on lost focus if (_parentCM == null && parentWin.ChildrenCount == 1 && parentWin.Children[0] is ContextMenuBase parentCM) { parentCM.ShowChild(this, parentCM.ScreenToClient(parent.ClientToScreen(location)), false); return; } // Unlock and perform controls update UnlockChildrenRecursive(); PerformLayout(); // Calculate popup direction and initial location (fit on a single monitor) Vector2 locationWS = parent.PointToWindow(location); Vector2 locationSS = parentWin.ClientToScreen(locationWS); Location = Vector2.Zero; Rectangle monitorBounds = Application.GetMonitorBounds(locationSS); Vector2 rightBottomLocationSS = locationSS + Size; bool isUp = false, isLeft = false; if (monitorBounds.Bottom < rightBottomLocationSS.Y) { // Direction: up isUp = true; locationSS.Y -= Height; } if (monitorBounds.Right < rightBottomLocationSS.X) { // Direction: left isLeft = true; locationSS.X -= Width; } // Update direction flag if (isUp) { _direction = isLeft ? ContextMenuDirection.LeftUp : ContextMenuDirection.RightUp; } else { _direction = isLeft ? ContextMenuDirection.LeftDown : ContextMenuDirection.RightDown; } // Create window var desc = CreateWindowSettings.Default; desc.Position = locationSS; desc.StartPosition = WindowStartPosition.Manual; desc.Size = Size; desc.Fullscreen = false; desc.HasBorder = false; desc.SupportsTransparency = false; desc.ShowInTaskbar = false; desc.ActivateWhenFirstShown = true; desc.AllowInput = true; desc.AllowMinimize = false; desc.AllowMaximize = false; desc.AllowDragAndDrop = false; desc.IsTopmost = true; desc.IsRegularWindow = false; desc.HasSizingFrame = false; _window = Window.Create(desc); _window.LostFocus += OnWindowLostFocus; // Attach to the window _parentCM = parent as ContextMenuBase; Parent = _window.GUI; // Show Visible = true; _window.Show(); PerformLayout(); Focus(); OnShow(); }
/// <summary> /// Shows tooltip over given control. /// </summary> /// <param name="target">The parent control to attach to it.</param> /// <param name="location">Popup menu origin location in parent control coordinates.</param> /// <param name="targetArea">Tooltip target area of interest.</param> public void Show(Control target, Vector2 location, Rectangle targetArea) { if (target == null) { throw new ArgumentNullException(); } // Ensure to be closed Hide(); // Unlock and perform controls update UnlockChildrenRecursive(); PerformLayout(); // Calculate popup direction and initial location var parentWin = target.Root; if (parentWin == null) { return; } float dpiScale = Platform.DpiScale; Vector2 dpiSize = Size * dpiScale; Vector2 locationWS = target.PointToWindow(location); Vector2 locationSS = parentWin.ClientToScreen(locationWS * dpiScale); Vector2 screenSize = Platform.VirtualDesktopSize; Vector2 rightBottomLocationSS = locationSS + dpiSize; if (screenSize.Y < rightBottomLocationSS.Y) { // Direction: up locationSS.Y -= dpiSize.Y; } if (screenSize.X < rightBottomLocationSS.X) { // Direction: left locationSS.X -= dpiSize.X; } _showTarget = target; // Create window var desc = CreateWindowSettings.Default; desc.StartPosition = WindowStartPosition.Manual; desc.Position = locationSS; desc.Size = dpiSize; desc.Fullscreen = false; desc.HasBorder = false; desc.SupportsTransparency = false; desc.ShowInTaskbar = false; desc.ActivateWhenFirstShown = false; desc.AllowInput = true; desc.AllowMinimize = false; desc.AllowMaximize = false; desc.AllowDragAndDrop = false; desc.IsTopmost = true; desc.IsRegularWindow = false; desc.HasSizingFrame = false; _window = Window.Create(desc); if (_window == null) { throw new InvalidOperationException("Failed to create tooltip window."); } // Attach to the window and focus Parent = _window.GUI; Visible = true; _window.Show(); }