无边框之后的拖动方法有三种。

我个人是喜欢第一和第三的方法,看个人去需求。

第三种代码比较仓促,有需要者可以立马用,或者稍作整理修改。

对于WIN10 .NET 4.5以上的框架可以使用

WIndowChrome

 <WindowChrome.WindowChrome>
<WindowChrome CaptionHeight="" />
</WindowChrome.WindowChrome>

其次是

通过DragMove方法来控制移动 此方法需要写在事件内,比如鼠标事件等

  private void AssociatedObject_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
(sender as Window).DragMove();
}

不过这个方法有些缺陷。

例如全屏之后无法通过鼠标移动恢复

再者就是WIn32API

先给出两份参考:

http://www.cnblogs.com/xuchonglei/archive/2011/04/12/2013913.html

https://blog.csdn.net/dlangu0393/article/details/12548731

我这里直接给出带代码

我是用behavior来配合的

  public class WinMove : Behavior<Grid>
{ protected override void OnAttached()
{
base.OnAttached(); AssociatedObject.MouseLeftButtonDown += AssociatedObject_MouseLeftButtonDown;
var b = new WindowBehaviorHelper(AssociatedObject.GetParentObject<Window>(null)); b.RepairBehavior(); } private void AssociatedObject_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{ if (e.OriginalSource is Grid || e.OriginalSource is Border || e.OriginalSource is Window)
{
WindowInteropHelper wih = new WindowInteropHelper(AssociatedObject.GetParentObject<Window>(null));//我附加在grid上 用来寻找窗口的
WindowBehaviorHelper.SendMessage(wih.Handle, 0x00A1, (IntPtr)WindowBehaviorHelper.HitTest.HTCAPTION, IntPtr.Zero);
return;
} } protected override void OnDetaching()
{
base.OnDetaching();
AssociatedObject.MouseLeftButtonDown -= AssociatedObject_MouseLeftButtonDown; }
} public class WindowBehaviorHelper
{
private const int WM_NCHITTEST = 0x0084; //测试消息
private const int WM_GETMINMAXINFO = 0x0024;//大小变化 private Window WindowTarget; //目标窗口
private int WidthCorner = ; //拐角宽度
private int ThicknessTransparentBorder = ; //透明宽度
private int ThicknessBorder = ; //边框宽度
private Point PointMouse = new Point(); //鼠标坐标
public enum HitTest : int //测试句柄
{
#region 测试句柄 HTERROR = -,
HTTRANSPARENT = -,
HTNOWHERE = ,
HTCLIENT = ,
HTCAPTION = ,
HTSYSMENU = ,
HTGROWBOX = ,
HTSIZE = HTGROWBOX,
HTMENU = ,
HTHSCROLL = ,
HTVSCROLL = ,
HTMINBUTTON = ,
HTMAXBUTTON = ,
HTLEFT = ,
HTRIGHT = ,
HTTOP = ,
HTTOPLEFT = ,
HTTOPRIGHT = ,
HTBOTTOM = ,
HTBOTTOMLEFT = ,
HTBOTTOMRIGHT = ,
HTBORDER = ,
HTREDUCE = HTMINBUTTON,
HTZOOM = HTMAXBUTTON,
HTSIZEFIRST = HTLEFT,
HTSIZELAST = HTBOTTOMRIGHT,
HTOBJECT = ,
HTCLOSE = ,
HTHELP = #endregion
} //构造函数
public WindowBehaviorHelper(Window window)
{
this.WindowTarget = window;
}
public IntPtr handle;
//修复行为
public void RepairBehavior()
{
if (WindowTarget == null)
return; this.WindowTarget.SourceInitialized += delegate
{
handle = (new WindowInteropHelper(WindowTarget)).Handle;
HwndSource hwndSource = HwndSource.FromHwnd(handle);
if (hwndSource != null)
{
hwndSource.AddHook(WindowProc);
}
};
} //消息循环
private IntPtr WindowProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
switch (msg)
{
case WM_NCHITTEST: if (WindowTarget.WindowState != WindowState.Normal)
{
break;
} this.PointMouse.X = (lParam.ToInt32() & 0xFFFF);
this.PointMouse.Y = (lParam.ToInt32() >> ); //窗口左上角
if (this.PointMouse.X > this.WindowTarget.Left + this.ThicknessTransparentBorder
&& this.PointMouse.X <= this.WindowTarget.Left + this.ThicknessTransparentBorder + this.WidthCorner
&& this.PointMouse.Y > this.WindowTarget.Top + this.ThicknessTransparentBorder
&& this.PointMouse.Y <= this.WindowTarget.Top + this.ThicknessTransparentBorder + this.WidthCorner)
{
handled = true;
return new IntPtr((int)HitTest.HTTOPLEFT);
}
//窗口左下角
else if (this.PointMouse.X > this.WindowTarget.Left + this.ThicknessTransparentBorder
&& this.PointMouse.X <= this.WindowTarget.Left + this.ThicknessTransparentBorder + this.WidthCorner
&& this.PointMouse.Y < this.WindowTarget.Top + this.WindowTarget.ActualHeight - this.ThicknessTransparentBorder
&& this.PointMouse.Y >= this.WindowTarget.Top + this.WindowTarget.ActualHeight - this.ThicknessTransparentBorder - this.WidthCorner)
{
handled = true;
return new IntPtr((int)HitTest.HTBOTTOMLEFT);
}
//窗口右上角
else if (this.PointMouse.X < this.WindowTarget.Left + this.WindowTarget.ActualWidth - this.ThicknessTransparentBorder
&& this.PointMouse.X >= this.WindowTarget.Left + this.WindowTarget.ActualWidth - this.ThicknessTransparentBorder - this.WidthCorner
&& this.PointMouse.Y > this.WindowTarget.Top + this.ThicknessTransparentBorder
&& this.PointMouse.Y <= this.WindowTarget.Top + this.ThicknessTransparentBorder + this.WidthCorner)
{
handled = true;
return new IntPtr((int)HitTest.HTTOPRIGHT);
}
//窗口右下角
else if (this.PointMouse.X < this.WindowTarget.Left + this.WindowTarget.ActualWidth - this.ThicknessTransparentBorder
&& this.PointMouse.X >= this.WindowTarget.Left + this.WindowTarget.ActualWidth - this.ThicknessTransparentBorder - this.WidthCorner
&& this.PointMouse.Y < this.WindowTarget.Top + this.WindowTarget.ActualHeight - this.ThicknessTransparentBorder
&& this.PointMouse.Y >= this.WindowTarget.Top + this.WindowTarget.ActualHeight - this.ThicknessTransparentBorder - this.WidthCorner)
{
handled = true;
return new IntPtr((int)HitTest.HTBOTTOMRIGHT);
}
//窗口左侧
else if (this.PointMouse.X > this.WindowTarget.Left + this.ThicknessTransparentBorder
&& this.PointMouse.X <= this.WindowTarget.Left + this.ThicknessTransparentBorder + this.ThicknessBorder
&& this.PointMouse.Y > this.WindowTarget.Top + this.ThicknessTransparentBorder
&& this.PointMouse.Y < this.WindowTarget.Top + this.WindowTarget.ActualHeight - this.ThicknessTransparentBorder)
{
handled = true;
return new IntPtr((int)HitTest.HTLEFT);
}
//窗口右侧
else if (this.PointMouse.X < this.WindowTarget.Left + this.WindowTarget.ActualWidth - this.ThicknessTransparentBorder
&& this.PointMouse.X >= this.WindowTarget.Left + this.WindowTarget.ActualWidth - this.ThicknessTransparentBorder - this.ThicknessBorder
&& this.PointMouse.Y > this.WindowTarget.Top + this.ThicknessTransparentBorder
&& this.PointMouse.Y < this.WindowTarget.Top + this.WindowTarget.ActualHeight - this.ThicknessTransparentBorder)
{
handled = true;
return new IntPtr((int)HitTest.HTRIGHT);
}
//窗口上方
else if (this.PointMouse.X > this.WindowTarget.Left + this.ThicknessTransparentBorder
&& this.PointMouse.X < this.WindowTarget.Left + this.WindowTarget.ActualWidth - this.ThicknessTransparentBorder
&& this.PointMouse.Y > this.WindowTarget.Top + this.ThicknessTransparentBorder
&& this.PointMouse.Y <= this.WindowTarget.Top + this.ThicknessTransparentBorder + this.ThicknessBorder)
{
handled = true;
return new IntPtr((int)HitTest.HTTOP);
}
//窗口下方
else if (this.PointMouse.X > this.WindowTarget.Left + this.ThicknessTransparentBorder
&& this.PointMouse.X < this.WindowTarget.Left + this.WindowTarget.ActualWidth - this.ThicknessTransparentBorder
&& this.PointMouse.Y < this.WindowTarget.Top + this.WindowTarget.ActualHeight - this.ThicknessTransparentBorder
&& this.PointMouse.Y >= this.WindowTarget.Top + this.WindowTarget.ActualHeight - this.ThicknessTransparentBorder - this.ThicknessBorder)
{
handled = true;
return new IntPtr((int)HitTest.HTBOTTOM);
}
//其他消息
else
{
SendMessage(handle, (int)0x00A1, (IntPtr)HitTest.HTCAPTION, IntPtr.Zero);
break;
} case WM_GETMINMAXINFO:
WmGetMinMaxInfo(hwnd, lParam);
handled = true;
break; default:
break;
}
return IntPtr.Zero;
} //更改最小化最大化时窗口位置大小
private void WmGetMinMaxInfo(IntPtr hwnd, IntPtr lParam)
{
MINMAXINFO mmi = (MINMAXINFO)Marshal.PtrToStructure(lParam, typeof(MINMAXINFO)); int MONITOR_DEFAULTTONEAREST = 0x00000002;
IntPtr monitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST); if (monitor != IntPtr.Zero)
{
MONITORINFO monitorInfo = new MONITORINFO();
GetMonitorInfo(monitor, monitorInfo);
RECT rcWorkArea = monitorInfo.rcWork;
RECT rcMonitorArea = monitorInfo.rcMonitor;
mmi.ptMaxPosition.x = Math.Abs(rcWorkArea.left - rcMonitorArea.left) - ;
mmi.ptMaxPosition.y = Math.Abs(rcWorkArea.top - rcMonitorArea.top) - ;
mmi.ptMaxSize.x = Math.Abs(rcWorkArea.right - rcWorkArea.left) + ;
mmi.ptMaxSize.y = Math.Abs(rcWorkArea.bottom - rcWorkArea.top) + ;
mmi.ptMinTrackSize.x = (int)this.WindowTarget.MinWidth;
mmi.ptMinTrackSize.y = (int)this.WindowTarget.MinHeight;
} Marshal.StructureToPtr(mmi, lParam, true);
} [DllImport("user32")]
internal static extern bool GetMonitorInfo(IntPtr hMonitor, MONITORINFO lpmi);
[DllImport("User32")]
internal static extern IntPtr MonitorFromWindow(IntPtr handle, int flags);
[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam);
#region Nested type: MINMAXINFO
[StructLayout(LayoutKind.Sequential)]
internal struct MINMAXINFO
{
public POINT ptReserved;
public POINT ptMaxSize;
public POINT ptMaxPosition;
public POINT ptMinTrackSize;
public POINT ptMaxTrackSize;
}
#endregion #region Nested type: MONITORINFO
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
internal class MONITORINFO
{
public int cbSize = Marshal.SizeOf(typeof(MONITORINFO));
public RECT rcMonitor;
public RECT rcWork;
public int dwFlags;
}
#endregion #region Nested type: POINT
[StructLayout(LayoutKind.Sequential)]
internal struct POINT
{
public int x;
public int y;
public POINT(int x, int y)
{
this.x = x;
this.y = y;
}
}
#endregion #region Nested type: RECT
[StructLayout(LayoutKind.Sequential, Pack = )]
internal struct RECT
{
public int left;
public int top;
public int right;
public int bottom; public static readonly RECT Empty; public int Width
{
get { return Math.Abs(right - left); }
}
public int Height
{
get { return bottom - top; }
} public RECT(int left, int top, int right, int bottom)
{
this.left = left;
this.top = top;
this.right = right;
this.bottom = bottom;
} public RECT(RECT rcSrc)
{
left = rcSrc.left;
top = rcSrc.top;
right = rcSrc.right;
bottom = rcSrc.bottom;
} public bool IsEmpty
{
get
{
return left >= right || top >= bottom;
}
} public override string ToString()
{
if (this == Empty)
{
return "RECT {Empty}";
}
return "RECT { left : " + left + " / top : " + top + " / right : " + right + " / bottom : " + bottom + " }";
} public override bool Equals(object obj)
{
if (!(obj is Rect))
{
return false;
}
return (this == (RECT)obj);
} public override int GetHashCode()
{
return left.GetHashCode() + top.GetHashCode() + right.GetHashCode() + bottom.GetHashCode();
} public static bool operator ==(RECT rect1, RECT rect2)
{
return (rect1.left == rect2.left && rect1.top == rect2.top && rect1.right == rect2.right && rect1.bottom == rect2.bottom);
} public static bool operator !=(RECT rect1, RECT rect2)
{
return !(rect1 == rect2);
}
}
#endregion
}

WPF 无边框拖动的更多相关文章

  1. WPF无边框拖动、全屏、缩放

    原文:WPF无边框拖动.全屏.缩放 版权声明:本文为博主原创文章,转载请注明出处. https://blog.csdn.net/lwwl12/article/details/78059361 先看效果 ...

  2. C# .net WPF无边框移动窗体

    转自 http://download.csdn.net/detail/xiang348352/3095084 WPF无边框移动窗体,先在<Window>里添加 MouseLeftButto ...

  3. wpf无边框窗体移动和大小调整

    原文:wpf无边框窗体移动和大小调整   using System; using System.Windows; using System.Windows.Interop; namespace Wpf ...

  4. WPF无边框捕获消息改变窗口大小

    原文:WPF无边框捕获消息改变窗口大小 文章大部分转载自http://blog.csdn.net/fwj380891124,如有问题,请联系删除  最近一直在学习 WPF,看着别人做的WPF程序那么漂 ...

  5. WPF无边框移动窗体

    WPF无边框移动窗体,先在<Window>里添加 MouseLeftButtonDown=”Window_MouseLeftButtonDown” 然后导航到事件,在事件里添加 if (e ...

  6. winform学习(9)无边框拖动窗体

    去除边框 选中窗体,在属性中找到FormBorderStyle,设置为None 实现无边框拖动 [DllImport("user32.dll")]        public st ...

  7. WPF无边框可拖动窗体

    下面主要记录下创建无边框窗体,并且可以拖动.这种窗体主要用于弹出小窗体时. <Window x:Class="WpfApplication1.MainWindow" xmln ...

  8. 【转载】 wpf无边框的方法以及拖拽的问题

    今天在做wpf程序的时候遇到了一个制作无边框的窗体并且有透明圆角的问题,我把解决的过程写下来,和大家学习 正常窗体必须把WindowStyle="None"这个属性加上去,但是加上 ...

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

    对于WPF,一旦隐藏了标题栏,就无法移动,这时候需要重写移动方法,下面列举常见的三种方式方式. 方式一:重写OnMouseLeftButtonDown protected override void ...

随机推荐

  1. Spring Boot 2.x 启动全过程源码分析

    Spring Boot 2.x 启动全过程源码分析 SpringApplication 实例 run 方法运行过程 上面分析了 SpringApplication 实例对象构造方法初始化过程,下面继续 ...

  2. tcpdf中文解决方案

    步骤如下:1.确保你测试tcpdf能正常输出英文内容的pdf2.测试输入中文内容后显示是?的乱码或者空白分析原因,是因为我们输入的中文,tcpdf字体库并不支持,因此乱码或者空白显示 添加一个合适的字 ...

  3. eclipse中debug改变变量的值

    step1:debug断点到变量的下一行,在debug试图的右上角variables中看到该变量的值: step2:鼠标右键点击str出现下图,选择Change Value... step3:点击Ch ...

  4. Motion Blur

    [Motion Blur] 此篇介绍最简单的全局Motion Blur.算法是将当前帧与前一帧按某一比例混合.这是一个过程,例如有10帧,在第1帧中,只有第1帧原图,第2帧中有1.2帧原图,第3帧中会 ...

  5. Python 入门学习(壹)上机时间提醒

    基于 Udacity 的 Python 入门课程 Programming Foundations with Python 基于 Python 2.7 控制台版本 思路 Project 1 是一个时间提 ...

  6. springboot中端点监管 endpoint actuator

    1.pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...

  7. 利率计算v5.0--结对--软件工程

    利率计算v5.--测试--软件工程 1.任务结对同伴: 名字:王昕明 学号: 博客地址 :http://home.cnblogs.com/u/xinmingwang/ Git : https://gi ...

  8. nslookup域名查询命令查询ip

    一.nslookup(name server lookup ) nslookup可以指定查询的类型,可以查到DNS记录的生存时间还可以指定使用哪个DNS服务器进行解释.在已安装TCP/IP协议的电脑上 ...

  9. 20155209 2016-2017-2 《Java程序设计》第七周学习总结

    20155209 2016-2017-2 <Java程序设计>第七周学习总结 教材学习内容总结 认识时间与日期 时间的度量 GMT(Greenwich Mean Time) 时间:现在不是 ...

  10. 移动直播app怎么做

    今年移动直播行业的兴起,诞生了一大批网红,甚至明星也开始直播了,因此不得不跟上时代的步伐,教你从零开始搭建一个完整的iOS直播app,希望能帮助到更多的人更快的了解直播. 了解直播 1 热门直播产品: ...