コード例 #1
0
        private void Resize()
        {
            if (_author==null) return;
            Rect rectListBox = VisualTreeHelper.GetDescendantBounds(((MainWindow)Owner).AuthorsListBox);
            if (rectListBox == Rect.Empty) return;
            double rectListBoxLeft = Owner.PointFromScreen(((MainWindow)Owner).AuthorsListBox.PointToScreen(rectListBox.Location)).X;
            // уточнить ширину по размеру listbox, может быть полоса прокрутки
            var correct = new Rect(rectListBoxLeft, _desiredRect.Location.Y,
                                   ((MainWindow) Owner).AuthorsListBox.ActualWidth, _desiredRect.Height);
            // пересчитать в экранный прямоугольник относительно экрана
            var rect = new Rect(Owner.PointToScreen(correct.Location), correct.Size);
            var working = SystemInformation.WorkingArea;
            // расстояние слева и справа
            var deltaRigth = working.Right - rect.Right;
            var deltaLeft = rect.Left - working.Left;
            // в автоматическом режиме пересчитывается сторона окна
            switch (_advancedAuthorWindowPosition)
            {
                case AdvancedAuthorWindowPosition.Left:
                    if ((deltaLeft < _setting.GetAdvancedWindowSetting(_author).Size.Width) && (deltaRigth > deltaLeft))
                        _advancedAuthorWindowPosition = AdvancedAuthorWindowPosition.Right;
                    break;
                case AdvancedAuthorWindowPosition.Right:
                    if ((deltaRigth < _setting.GetAdvancedWindowSetting(_author).Size.Width) && (deltaLeft > deltaRigth))
                        _advancedAuthorWindowPosition = AdvancedAuthorWindowPosition.Left;
                    break;
            }

            if (_setting.DesiredPositionAdvancedWindow == DesiredPositionAdvancedWindow.Right)
                _advancedAuthorWindowPosition = AdvancedAuthorWindowPosition.Right;
            if (_setting.DesiredPositionAdvancedWindow == DesiredPositionAdvancedWindow.Left)
                _advancedAuthorWindowPosition = AdvancedAuthorWindowPosition.Left;

            double left = Left;
            double height = Height;
            double width = Width;

            // пересчитываем положение и размеры
            if (_setting.DesiredPositionAdvancedWindow == DesiredPositionAdvancedWindow.Auto)
            {
                // по ширине
                switch (_advancedAuthorWindowPosition)
                {
                    case AdvancedAuthorWindowPosition.Left:
                        left = Math.Max(0, rect.Left - _setting.GetAdvancedWindowSetting(_author).Size.Width);
                        width = rect.Left - left;
                        break;
                    case AdvancedAuthorWindowPosition.Right:
                        left = rect.Right;
                        width = Math.Min(_setting.GetAdvancedWindowSetting(_author).Size.Width, working.Right - left);
                        break;
                }
            }
            else
            {
                // по ширине
                switch (_advancedAuthorWindowPosition)
                {
                    case AdvancedAuthorWindowPosition.Left:
                        left = rect.Left - _setting.GetAdvancedWindowSetting(_author).Size.Width;
                        break;
                    case AdvancedAuthorWindowPosition.Right:
                        left = rect.Right;
                        width = _setting.GetAdvancedWindowSetting(_author).Size.Width;
                        break;
                }
            }

            // по высоте
            double top = rect.Top;
            if (top + _setting.GetAdvancedWindowSetting(_author).Size.Height > working.Height) top = working.Height - height;
            if (top + height < rect.Bottom) top = rect.Bottom - height;

            // присваиваем вручную, _manualChange нужно, чтобы Window_SizeChanged
            // не изменил желаемые размеры окна, установленные мышью
            _manualChange = true;
            Top = top;
            Height = height;
            Width = width;
            Left = left;
            _manualChange = false;
        }
コード例 #2
0
        private void Resize()
        {
            if (_author == null)
            {
                return;
            }
            Rect rectListBox = VisualTreeHelper.GetDescendantBounds(((MainWindow)Owner).AuthorsListBox);

            if (rectListBox == Rect.Empty)
            {
                return;
            }
            double rectListBoxLeft = Owner.PointFromScreen(((MainWindow)Owner).AuthorsListBox.PointToScreen(rectListBox.Location)).X;
            // уточнить ширину по размеру listbox, может быть полоса прокрутки
            var correct = new Rect(rectListBoxLeft, _desiredRect.Location.Y,
                                   ((MainWindow)Owner).AuthorsListBox.ActualWidth, _desiredRect.Height);
            // пересчитать в экранный прямоугольник относительно экрана
            var rect    = new Rect(Owner.PointToScreen(correct.Location), correct.Size);
            var working = SystemInformation.WorkingArea;
            // расстояние слева и справа
            var deltaRigth = working.Right - rect.Right;
            var deltaLeft  = rect.Left - working.Left;

            // в автоматическом режиме пересчитывается сторона окна
            switch (_advancedAuthorWindowPosition)
            {
            case AdvancedAuthorWindowPosition.Left:
                if ((deltaLeft < _setting.GetAdvancedWindowSetting(_author).Size.Width) && (deltaRigth > deltaLeft))
                {
                    _advancedAuthorWindowPosition = AdvancedAuthorWindowPosition.Right;
                }
                break;

            case AdvancedAuthorWindowPosition.Right:
                if ((deltaRigth < _setting.GetAdvancedWindowSetting(_author).Size.Width) && (deltaLeft > deltaRigth))
                {
                    _advancedAuthorWindowPosition = AdvancedAuthorWindowPosition.Left;
                }
                break;
            }

            if (_setting.DesiredPositionAdvancedWindow == DesiredPositionAdvancedWindow.Right)
            {
                _advancedAuthorWindowPosition = AdvancedAuthorWindowPosition.Right;
            }
            if (_setting.DesiredPositionAdvancedWindow == DesiredPositionAdvancedWindow.Left)
            {
                _advancedAuthorWindowPosition = AdvancedAuthorWindowPosition.Left;
            }

            double left   = Left;
            double height = Height;
            double width  = Width;

            // пересчитываем положение и размеры
            if (_setting.DesiredPositionAdvancedWindow == DesiredPositionAdvancedWindow.Auto)
            {
                // по ширине
                switch (_advancedAuthorWindowPosition)
                {
                case AdvancedAuthorWindowPosition.Left:
                    left  = Math.Max(0, rect.Left - _setting.GetAdvancedWindowSetting(_author).Size.Width);
                    width = rect.Left - left;
                    break;

                case AdvancedAuthorWindowPosition.Right:
                    left  = rect.Right;
                    width = Math.Min(_setting.GetAdvancedWindowSetting(_author).Size.Width, working.Right - left);
                    break;
                }
            }
            else
            {
                // по ширине
                switch (_advancedAuthorWindowPosition)
                {
                case AdvancedAuthorWindowPosition.Left:
                    left = rect.Left - _setting.GetAdvancedWindowSetting(_author).Size.Width;
                    break;

                case AdvancedAuthorWindowPosition.Right:
                    left  = rect.Right;
                    width = _setting.GetAdvancedWindowSetting(_author).Size.Width;
                    break;
                }
            }

            // по высоте
            double top = rect.Top;

            if (top + _setting.GetAdvancedWindowSetting(_author).Size.Height > working.Height)
            {
                top = working.Height - height;
            }
            if (top + height < rect.Bottom)
            {
                top = rect.Bottom - height;
            }

            // присваиваем вручную, _manualChange нужно, чтобы Window_SizeChanged
            // не изменил желаемые размеры окна, установленные мышью
            _manualChange = true;
            Top           = top;
            Height        = height;
            Width         = width;
            Left          = left;
            _manualChange = false;
        }