Пример #1
0
        public static void SetPosition(Window window, WindowPositionsInfo positionInfo)
        {
            if (positionInfo == null)
            {
                throw new ArgumentNullException(nameof(positionInfo));
            }

            if (!TryGetWindowPosition(positionInfo, out Rectangle position))
            {
                return;
            }

            window.WindowStartupLocation = WindowStartupLocation.Manual;

            window.Left = position.X;
            window.Top  = position.Y;

            if (position.Width > 0)
            {
                window.Width = position.Width;
            }

            if (position.Height > 0)
            {
                window.Height = position.Height;
            }

            if (positionInfo.DisplaySettings != null)
            {
                window.WindowState = positionInfo.DisplaySettings.Maximized ?
                                     WindowState.Maximized :
                                     WindowState.Normal;
            }
        }
Пример #2
0
        private static bool TryGetWindowPosition(WindowPositionsInfo positionsInfo, out Rectangle position)
        {
            double left = 0, top = 0, width = 0, height = 0;

            // use settings
            if (positionsInfo.DisplaySettings != null)
            {
                // get screen
                var screen = Screen.AllScreens
                             .FirstOrDefault(x => positionsInfo.DisplaySettings.Left >= x.Bounds.Left &&
                                             positionsInfo.DisplaySettings.Left <= x.Bounds.Right &&
                                             positionsInfo.DisplaySettings.Top >= x.Bounds.Top &&
                                             positionsInfo.DisplaySettings.Top <= x.Bounds.Bottom);

                if (screen != null)
                {
                    if (positionsInfo.StartupLocation == WindowStartupLocation.CenterScreen)
                    {
                        if (positionsInfo.Width <= screen.Bounds.Width)
                        {
                            left  = screen.Bounds.Left + (screen.Bounds.Width - positionsInfo.Width) / 2;
                            width = positionsInfo.Width;
                        }
                        else
                        {
                            left  = screen.Bounds.Left;
                            width = screen.Bounds.Width;
                        }

                        if (positionsInfo.Height <= screen.Bounds.Height)
                        {
                            top    = screen.Bounds.Top + (screen.Bounds.Height - positionsInfo.Height) / 2;
                            height = positionsInfo.Height;
                        }
                        else
                        {
                            top    = screen.Bounds.Top;
                            height = screen.Bounds.Height;
                        }
                    }
                    else
                    {
                        left   = positionsInfo.DisplaySettings.Left;
                        top    = positionsInfo.DisplaySettings.Top;
                        width  = positionsInfo.DisplaySettings.Width;
                        height = positionsInfo.DisplaySettings.Height;

                        if (left + width > screen.WorkingArea.Right)
                        {
                            var shiftLeft = left + width - screen.WorkingArea.Right;

                            if (shiftLeft > left - screen.WorkingArea.Left)
                            {
                                shiftLeft = shiftLeft - left + screen.WorkingArea.Left;
                                left      = screen.WorkingArea.Left;

                                if (width - shiftLeft > screen.WorkingArea.Width)
                                {
                                    width = screen.WorkingArea.Width;
                                }
                                else
                                {
                                    width = width - shiftLeft;
                                }
                            }
                            else
                            {
                                left = left - shiftLeft;
                            }
                        }

                        if (top < 0)
                        {
                            top = 0;
                        }

                        if (top + height > screen.WorkingArea.Bottom)
                        {
                            var shiftTop = top + height - screen.WorkingArea.Bottom;

                            if (shiftTop > top - screen.WorkingArea.Top)
                            {
                                shiftTop = shiftTop - top + screen.WorkingArea.Top;
                                top      = screen.WorkingArea.Top;

                                if (height - shiftTop > screen.WorkingArea.Height)
                                {
                                    height = screen.WorkingArea.Height;
                                }
                                else
                                {
                                    height = height - shiftTop;
                                }
                            }
                            else
                            {
                                top = top - shiftTop;
                            }
                        }
                    }

                    position = new Rectangle((int)left, (int)top, (int)width, (int)height);
                    return(true);
                }
            }

            var primaryScreen = Screen.AllScreens.FirstOrDefault(x => x.Primary);

            if (primaryScreen == null)
            {
                position = new Rectangle();
                return(false);
            }

            if (positionsInfo.Width <= primaryScreen.WorkingArea.Width)
            {
                left  = primaryScreen.WorkingArea.Left + (primaryScreen.WorkingArea.Width - positionsInfo.Width) / 2;
                width = positionsInfo.Width;
            }
            else
            {
                left  = primaryScreen.WorkingArea.Left;
                width = primaryScreen.WorkingArea.Width;
            }

            if (positionsInfo.Height <= primaryScreen.WorkingArea.Height)
            {
                top    = primaryScreen.WorkingArea.Top + (primaryScreen.WorkingArea.Height - positionsInfo.Height) / 2;
                height = positionsInfo.Height;
            }
            else
            {
                top    = primaryScreen.WorkingArea.Top;
                height = primaryScreen.WorkingArea.Height;
            }

            position = new Rectangle((int)left, (int)top, (int)width, (int)height);
            return(true);
        }