DragMove() and Maximize

前端 未结 6 1098
误落风尘
误落风尘 2020-12-16 01:32

I have a problem with my custom window (AllowTransparency, WindowStyle=None) in WPF. DragMove() method works good, but when I maximize window, or it maximizing automatically

6条回答
  •  囚心锁ツ
    2020-12-16 01:39

    Groaner's solution does not function properly with multiple monitor setups, especially where the primary monitor is not the left-most.

    Here is my solution based on his which handles single or multiple monitor setups properly. In this code 'rctHeader' is a Rectangle defined in the XAML.

        private bool mRestoreIfMove = false;
    
    
        public MainWindow()
        {
            InitializeComponent();
        }
    
    
        private void SwitchWindowState()
        {
            switch (WindowState)
            {
                case WindowState.Normal:
                    {
                        WindowState = WindowState.Maximized;
                        break;
                    }
                case WindowState.Maximized:
                    {
                        WindowState = WindowState.Normal;
                        break;
                    }
            }
        }
    
    
        private void rctHeader_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            if (e.ClickCount == 2)
            {
                if ((ResizeMode == ResizeMode.CanResize) || (ResizeMode == ResizeMode.CanResizeWithGrip))
                {
                    SwitchWindowState();
                }
    
                return;
            }
    
            else if (WindowState == WindowState.Maximized)
            {
                mRestoreIfMove = true;
                return;
            }
    
            DragMove();
        }
    
    
        private void rctHeader_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            mRestoreIfMove = false;
        }
    
    
        private void rctHeader_MouseMove(object sender, MouseEventArgs e)
        {
            if (mRestoreIfMove)
            {
                mRestoreIfMove = false;
    
                double percentHorizontal = e.GetPosition(this).X / ActualWidth;
                double targetHorizontal = RestoreBounds.Width * percentHorizontal;
    
                double percentVertical = e.GetPosition(this).Y / ActualHeight;
                double targetVertical = RestoreBounds.Height * percentVertical;
    
                WindowState = WindowState.Normal;
    
                POINT lMousePosition;
                GetCursorPos(out lMousePosition);
    
                Left = lMousePosition.X - targetHorizontal;
                Top = lMousePosition.Y - targetVertical;
    
                DragMove();
            }
        }
    
    
    
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool GetCursorPos(out POINT lpPoint);
    
    
        [StructLayout(LayoutKind.Sequential)]
        public struct POINT
        {
            public int X;
            public int Y;
    
            public POINT(int x, int y)
            {
                this.X = x;
                this.Y = y;
            }
        }
    
    
    }
    

提交回复
热议问题