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; }
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; }