让窗口动起来:
背景:因为使用了WindowStyle = “None”,所以窗口无法移动了;
需求:现在让我们为K3WindowHeader添加一些代码,从而让用户可以延续传统的鼠标拖拽窗口标题方式移动窗口;
实现:
捕获三个鼠标事件:
this.borderRoot.MouseLeftButtonDown += new MouseButtonEventHandler(BorderRoot_MouseLeftButtonDown);
this.borderRoot.MouseMove += new MouseEventHandler(BorderRoot_MouseMove);
this.borderRoot.MouseLeftButtonUp += new MouseButtonEventHandler(BorderRoot_MouseLeftButtonUp);
添加事件处理代码:
#region >>>>> 内部变量 ...
bool _isMouseLeftButtonDown = false;
Point _pointMouseLeftButtonOriginal = new Point(0, 0);
#endregion
void BorderRoot_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
_isMouseLeftButtonDown = true;
_pointMouseLeftButtonOriginal = PointToScreen(e.GetPosition(this));
this.borderRoot.CaptureMouse();
}
void BorderRoot_MouseMove(object sender, MouseEventArgs e)
{
if (_isMouseLeftButtonDown)
{
Window winParent = (this.Parent as Grid).Parent as Window;
Point pointCurrent = PointToScreen(e.GetPosition(this));
winParent.Left += pointCurrent.X - _pointMouseLeftButtonOriginal.X;
winParent.Top += pointCurrent.Y - _pointMouseLeftButtonOriginal.Y;
_pointMouseLeftButtonOriginal = pointCurrent;
}
}
void BorderRoot_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
_isMouseLeftButtonDown = false;
this.borderRoot.ReleaseMouseCapture();
}
注:
我将最外层 Border 命名为borderRoot。逻辑不多说了。CaptureMouse() 和 ReleaseMouseCapture() 也很重要!
F5,看看结果!
上面为了尽快看到结果,再一次使用了hard code方式找到父窗口,现在换个通用的方式,否则总有点“鱼鲠在喉,芒刺在背”的感觉。
记得我们还有个K3Helper工程吧,在这里我们创建一个K3Common类,并在其中实现一个静态方法,由它来沿着指定对象的 Visual Tree 上行,找到符合条件的Parent。
using System.Windows; // 这个需要引入WindowsBase
using System.Windows.Media; // 这个需要引入PresentationCore
namespace K3Helper
{
public class K3Common
{
public static DependencyObject GetVisualParent<T>(DependencyObject source)
{
while ((source != null) && (source.GetType() != typeof(T)) && !(source is T))
{
source = VisualTreeHelper.GetParent(source);
}
return source;
}
}
}
好了,重新修正一下MouseMove部分代码:
void BorderRoot_MouseMove(object sender, MouseEventArgs e)
{
if (_isMouseLeftButtonDown)
{
DependencyObject objParent = K3Helper.K3Common.GetVisualParent<Window>(this);
if (objParent != null)
{
Window winParent = objParent as Window;
Point pointCurrent = PointToScreen(e.GetPosition(this));
winParent.Left += pointCurrent.X - _pointMouseLeftButtonOriginal.X;
winParent.Top += pointCurrent.Y - _pointMouseLeftButtonOriginal.Y;
_pointMouseLeftButtonOriginal = pointCurrent;
}
}
}
F5,看看结果!
写东西好累,好在今天的电视节目还不错(江苏卫视),边看边写,^_^