private void ShowZoomWindow(int x, int y) { if (_zoomWindow == null) { _zoomWindow = new ZoomWindow(); _zoomWindow.Content = _zoomViewModel; _zoomWindow.Loaded += ZoomWindow_Loaded; _zoomWindow.IsVisibleChanged += ZoomWindow_IsVisibleChanged; } // we just started zooming, remember where we opened zoom window if (_currentZoomLevel == 1 && _previousZoomLevel == 0) { var dpi = MonitorResolutionHelper.GetCurrentMonitorDpi(); _previousScaledX = x / dpi.DpiScaleX; _previousScaledY = y / dpi.DpiScaleY; } _lastLeft = Math.Floor(_previousScaledX - (BaseZoomImageSize * Math.Pow(ZoomFactor, _currentZoomLevel - 1) / 2)); _lastTop = Math.Floor(_previousScaledY - (BaseZoomImageSize * Math.Pow(ZoomFactor, _currentZoomLevel - 1) / 2)); var justShown = false; if (!_zoomWindow.IsVisible) { _zoomWindow.Left = _lastLeft; _zoomWindow.Top = _lastTop; _zoomViewModel.Height = BaseZoomImageSize; _zoomViewModel.Width = BaseZoomImageSize; _zoomWindow.Show(); justShown = true; // make sure color picker window is on top of just opened zoom window AppStateHandler.SetTopMost(); } // dirty hack - sometimes when we just show a window on a second monitor with different DPI, // window position is not set correctly on a first time, we need to "ping" it again to make it appear on the proper location if (justShown) { _zoomWindow.Left = _lastLeft + 1; _zoomWindow.Top = _lastTop + 1; SessionEventHelper.Event.ZoomUsed = true; } _throttledActionInvoker.ScheduleAction( () => { _zoomWindow.DesiredLeft = _lastLeft; _zoomWindow.DesiredTop = _lastTop; _zoomViewModel.DesiredHeight = BaseZoomImageSize * _zoomViewModel.ZoomFactor; _zoomViewModel.DesiredWidth = BaseZoomImageSize * _zoomViewModel.ZoomFactor; }, ZoomWindowChangeDelayInMS); }
private void ShowZoomWindow(System.Windows.Point point) { _zoomWindow ??= new ZoomWindow { Content = _zoomViewModel, Opacity = 0, }; if (!_zoomWindow.IsVisible) { _zoomWindow.Show(); } if (_zoomWindow.Opacity < 0.5) { var halfWidth = _zoomWindow.Width / 2; var halfHeight = _zoomWindow.Height / 2; // usually takes 1-3 iterations to converge // 5 is just an arbitrary limit to prevent infinite loops for (var i = 0; i < 5; i++) { // mouse position relative to top left of _zoomWindow var scaledPoint = _zoomWindow.PointFromScreen(point); var diffX = scaledPoint.X - halfWidth; var diffY = scaledPoint.Y - halfHeight; // minimum difference that is considered important const double minDiff = 0.05; if (Math.Abs(diffX) < minDiff && Math.Abs(diffY) < minDiff) { break; } _zoomWindow.Left += diffX; _zoomWindow.Top += diffY; } // make sure color picker window is on top of just opened zoom window AppStateHandler.SetTopMost(); _zoomWindow.Opacity = 1; } _zoomViewModel.DesiredHeight = BaseZoomImageSize * _zoomViewModel.ZoomFactor; _zoomViewModel.DesiredWidth = BaseZoomImageSize * _zoomViewModel.ZoomFactor; }