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