예제 #1
0
        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);
        }
예제 #2
0
        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;
        }