欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-08 08:06:13
...

对于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。