對於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。