WPF中实现砖块拖动的方法(2)

这篇文章解决一下上一篇中剩下的问题,拖动的过程中,按钮的位置实时更新。

本来是看的微软提供的例子,例子里面是使用的AdornerLayer来实现的,实现了一个Adorner类,但实际上不需要那么复杂,确定鼠标按下,然后拖动过程中实时更新控件位置,跟鼠标放开的时候做的事是一样的。

代码如下:

private bool _isDown;

#region canvas的事件
//鼠标左键按下事件
private void canvas1_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
   _isDown = true;
}

/// <summary>
/// 鼠标左键弹起事件,是以鼠标左键按下为前提的
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void canvas1_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
   UpdatePosition(e.Source as UIElement);
   _isDown = false;
}

/// <summary>
/// 鼠标移动事件,是以鼠标左键按下为前提的
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void canvas1_PreviewMouseMove(object sender, MouseEventArgs e)
{
   if (!_isDown)
     return;
   UpdatePosition(e.Source as UIElement);
}
#endregion

/// <summary>
/// 控件位置更新
/// </summary>
/// <param name="ui"></param>
private void UpdatePosition(UIElement ui)
{
   Point CurrentPosition = System.Windows.Input.Mouse.GetPosition(canvas1);
   Canvas.SetTop(ui, CurrentPosition.Y);
   Canvas.SetLeft(ui, CurrentPosition.X);
}

根据鼠标的位置来更新控件的位置,还是有点不太准确,微软的例子里面的AdornerLayer是来计算按钮实际位置跟鼠标位置的偏移量的,我的理解有误,微软的demo代码,点击这里查看。

posted @ 2013-11-10 22:54  _倔强  阅读(393)  评论(0编辑  收藏  举报