private static void MoveToolTip(IInputElement? target, ToolTip? toolTip) { if (toolTip is null || target is null || toolTip.PlacementTarget is null) { return; } toolTip.SetCurrentValue(ToolTip.PlacementProperty, PlacementMode.Relative); var hOffsetFromToolTip = GetAutoMoveHorizontalOffset(toolTip); var vOffsetFromToolTip = GetAutoMoveVerticalOffset(toolTip); var dpi = DpiHelper.GetDpi(toolTip); Debug.WriteLine(">>dpi >> x: {0} \t y: {1}", dpi.DpiScaleX, dpi.DpiScaleY); var hDPIOffset = DpiHelper.TransformToDeviceX(toolTip.PlacementTarget, hOffsetFromToolTip, dpi.DpiScaleX); var vDPIOffset = DpiHelper.TransformToDeviceY(toolTip.PlacementTarget, vOffsetFromToolTip, dpi.DpiScaleY); var position = Mouse.GetPosition(toolTip.PlacementTarget); var newHorizontalOffset = position.X + hDPIOffset; var newVerticalOffset = position.Y + vDPIOffset; var topLeftFromScreen = toolTip.PlacementTarget.PointToScreen(new Point(0, 0)); if (MonitorHelper.TryGetMonitorInfoFromPoint(out var mInfo)) { Debug.WriteLine(">>rcWork >> w: {0} \t h: {1}", mInfo.rcWork.GetWidth(), mInfo.rcWork.GetHeight()); Debug.WriteLine(">>rcMonitor >> w: {0} \t h: {1}", mInfo.rcMonitor.GetWidth(), mInfo.rcMonitor.GetHeight()); var monitorWorkWidth = Math.Abs(mInfo.rcWork.GetWidth()); var monitorWorkHeight = Math.Abs(mInfo.rcWork.GetHeight()); if (monitorWorkWidth == 0 || monitorWorkHeight == 0) { Trace.TraceError("Got wrong monitor info values ({0})", mInfo.rcWork); return; } topLeftFromScreen.X = -mInfo.rcWork.left + topLeftFromScreen.X; topLeftFromScreen.Y = -mInfo.rcWork.top + topLeftFromScreen.Y; var locationX = (int)topLeftFromScreen.X % monitorWorkWidth; var locationY = (int)topLeftFromScreen.Y % monitorWorkHeight; var renderDpiWidth = DpiHelper.TransformToDeviceX(toolTip.PlacementTarget, toolTip.RenderSize.Width, dpi.DpiScaleX); var rightX = locationX + newHorizontalOffset + renderDpiWidth; if (rightX > monitorWorkWidth) { newHorizontalOffset = position.X - toolTip.RenderSize.Width - (0.5 * hDPIOffset); } var renderDPIHeight = DpiHelper.TransformToDeviceY(toolTip.PlacementTarget, toolTip.RenderSize.Height, dpi.DpiScaleY); var bottomY = locationY + newVerticalOffset + renderDPIHeight; if (bottomY > monitorWorkHeight) { newVerticalOffset = position.Y - toolTip.RenderSize.Height - (0.5 * vDPIOffset); } Debug.WriteLine(">>tooltip >> bY: {0:F} \t rX: {1:F}", bottomY, rightX); toolTip.HorizontalOffset = newHorizontalOffset; toolTip.VerticalOffset = newVerticalOffset; Debug.WriteLine(">>offset >> ho: {0:F} \t vo: {1:F}", toolTip.HorizontalOffset, toolTip.VerticalOffset); } }
private static void MoveToolTip(IInputElement target, ToolTip toolTip) { if (toolTip == null || target == null || toolTip.PlacementTarget == null) { return; } toolTip.Placement = PlacementMode.Relative; var hOffsetFromToolTip = GetAutoMoveHorizontalOffset(toolTip); var vOffsetFromToolTip = GetAutoMoveVerticalOffset(toolTip); var dpi = DpiHelper.GetDpi(toolTip); var hDPIOffset = DpiHelper.TransformToDeviceX(toolTip.PlacementTarget, hOffsetFromToolTip, dpi.DpiScaleX); var vDPIOffset = DpiHelper.TransformToDeviceY(toolTip.PlacementTarget, vOffsetFromToolTip, dpi.DpiScaleY); var position = Mouse.GetPosition(toolTip.PlacementTarget); var newHorizontalOffset = position.X + hDPIOffset; var newVerticalOffset = position.Y + vDPIOffset; var topLeftFromScreen = toolTip.PlacementTarget.PointToScreen(new Point(0, 0)); MONITORINFO monitorINFO = null; try { monitorINFO = MonitorHelper.GetMonitorInfoFromPoint(); } catch (UnauthorizedAccessException ex) { Debug.WriteLine("UnauthorizedAccessException occurred getting MONITORINFO: {0}", ex.Message); } if (monitorINFO != null) { Debug.WriteLine(">>rcWork >> w: {0} h: {1}", monitorINFO.rcWork.Width, monitorINFO.rcWork.Height); Debug.WriteLine(">>rcMonitor >> w: {0} h: {1}", monitorINFO.rcMonitor.Width, monitorINFO.rcMonitor.Height); var monitorWorkWidth = Math.Abs(monitorINFO.rcWork.Width); // (int)DpiHelper.TransformToDeviceX(toolTip.PlacementTarget, SystemParameters.PrimaryScreenWidth); var monitorWorkHeight = Math.Abs(monitorINFO.rcWork.Height); // (int)DpiHelper.TransformToDeviceY(toolTip.PlacementTarget, SystemParameters.PrimaryScreenHeight); if (topLeftFromScreen.X < 0) { topLeftFromScreen.X = -monitorINFO.rcWork.Left + topLeftFromScreen.X; } if (topLeftFromScreen.Y < 0) { topLeftFromScreen.Y = -monitorINFO.rcWork.Top + topLeftFromScreen.Y; } var locationX = (int)topLeftFromScreen.X % monitorWorkWidth; var locationY = (int)topLeftFromScreen.Y % monitorWorkHeight; var renderDPIWidth = DpiHelper.TransformToDeviceX(toolTip.RenderSize.Width, dpi.DpiScaleX); var rightX = locationX + newHorizontalOffset + renderDPIWidth; if (rightX > monitorWorkWidth) { newHorizontalOffset = position.X - toolTip.RenderSize.Width - 0.5 * hDPIOffset; } var renderDPIHeight = DpiHelper.TransformToDeviceY(toolTip.RenderSize.Height, dpi.DpiScaleY); var bottomY = locationY + newVerticalOffset + renderDPIHeight; if (bottomY > monitorWorkHeight) { newVerticalOffset = position.Y - toolTip.RenderSize.Height - 0.5 * vDPIOffset; } Debug.WriteLine(">>tooltip >> bottomY: {0:F} rightX: {1:F}", bottomY, rightX); toolTip.HorizontalOffset = newHorizontalOffset; toolTip.VerticalOffset = newVerticalOffset; Debug.WriteLine(">>offset >> ho: {0:F} vo: {1:F}", toolTip.HorizontalOffset, toolTip.VerticalOffset); } }
/// <summary> /// Get DPI of monitor where the window is /// </summary> private void GetDpi() { DpiHelper.GetDpi(Handle, out var dpiX, out var dpiY); DpiX = dpiX; DpiY = dpiY; }