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