窗口可以悬停在一侧,如QQ等软件的功能还是挺有用的,在WPF中,那么该如何实现该功能呢?
既然可以停靠在一侧,那么有几种方法,但是核心都离不开窗口的移动,鼠标的移入和移除组合来实现。
效果模拟:
布局设计(深蓝色:屏幕,黄色+橘黄为程序窗口)
重写窗口样式:
原有的窗口样式是不能够要的了,不然悬停的时候显示的悬停提示太难看了,如果真的不重新写窗口的样式,那么就只能够通过切换窗口来实现了,不过切换的窗口样式还是得重写,即使应用了窗口的样式None,那么效果也不是很理想。自己试过就知道了。
WPF重写窗口样式,说白了,还是没有离开那个设置窗口样式成None,然后在写窗口的title,显示的内容,button等,这个相对来说也不是很难,如果会Blend的话,可以相对轻松的实现,在这里不做过多的啰嗦,关键的是最外层的容器要距离上下左右各10(根据自己的实际情况进行调整,像我做的这个就仅仅支持左侧悬停,那么设计的时候最外层的容器仅仅距离右侧10。而里面的内容要设置Margin为-10。
你可能要问,为什么要有这个10呢?不设计窗口的基础样式,直接写个Margin(0,0,-10,0)不就行了,原因是虽然我们设计的时候-10会显示在最外面,但是已经超出了内容容器的大小,就不会显示了。这样基础布局工作就成功了。
设计布局:
在写窗口样式的时候,由于我们让内容容器与设计的窗口大小相同,因此在布局的时候我们还要找回来,即用个Grid,如果是上下左右都有的,则分成3行3列,像我这种情况,仅仅需要分成2列,一列宽度设置成*,另一列的宽度设置成10(根据你实际的设置),内容显示什么就无所谓了,关键是在第1列(即右侧的一列)假如一个控件(我用的是grid,里面放了个路径,漂亮一些),我定义的名字为grdRightFixed,OK,布局也就写好了。
写后台逻辑:
基础的实现就是应用鼠标的移动,获取屏幕的位置,计算。在控制一下显示的动画(如果不设置一下,效果是鼠标一离开或一移入则瞬间跳动,效果不好)。
距离的计算在第一幅图中已经展示了:
在鼠标移开程序窗口的时候,程序窗口要左移,移动的距离就是当前窗口的宽度-你设定固定在一侧的显示控件宽度+程序距离屏幕左侧的距离。
而当鼠标移入到固定在一侧的显示控件上时,则移动的位置是之前记录好的,记录是在鼠标移出程序窗口时候记录的。
为了显示动画,使用了另一个线程,控制动画的流畅度。
由于在设计的界面没有添加任何的鼠标事件,因此所有的鼠标事件均在后台的代码中写的和实现。
当然,鼠标离开窗口也不能立即执行移动,有可能用户鼠标移动的快了,移动到窗口外,定时器就是这个作用。
附上后台代码: