WPFの无边框窗体以及控件的移动

对于WPF,一旦隐藏了标题栏,就无法移动,这时候需要重写移动方法,下面列举常见的三种方式方式。

方式一:重写OnMouseLeftButtonDown

  

        protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
        {
            base.OnMouseLeftButtonDown(e);

            // 获取鼠标相对标题栏位置  
            Point position = e.GetPosition(bTop);

            // 如果鼠标位置在标题栏内,允许拖动  
            if (e.LeftButton == MouseButtonState.Pressed)
            {
                if (position.X >= 0 && position.X < bTop.ActualWidth && position.Y >= 0 && position.Y < bTop.ActualHeight)
                {
                    this.DragMove();
                }
            }
        }

  这种方式bTop是鼠标按下的区域,可以是窗体的grid,border,也可以是自己重新定义的border。

方式二:新建一个鼠标按下事件

        private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            if (e.LeftButton == MouseButtonState.Pressed)
            {
                this.DragMove();
            }
        }

方式三:窗体的消息机制(需要建立相关的消息委托)

        public new void DragMove()
        {
            if (this.WindowState == WindowState.Normal)
            {
                SendMessage(hs.Handle, WM_SYSCOMMAND, (IntPtr)0xf012, IntPtr.Zero);
                SendMessage(hs.Handle, WM_LBUTTONUP, IntPtr.Zero, IntPtr.Zero);
            }
        }  

 注意:如果无边框窗体中有Textbox等需要操作,直接用dragMove会造成干扰,导致不能很好的拖动兼容,这时我们可以如下处理,在窗体的Load下添加如下代码:

            gmain.MouseMove += delegate (object sender_d, MouseEventArgs e_d)
              {
                  if (e_d.LeftButton == MouseButtonState.Pressed)
                  {
                      if (e_d.MouseDevice.Target is Control)
                          return;
                      this.DragMove();
                  }

              };

gmain表示窗体整体的Grid。

原文地址:https://www.cnblogs.com/xietianjiao/p/7325137.html