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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM