这篇文章解决一下上一篇中剩下的问题,拖动的过程中,按钮的位置实时更新。
本来是看的微软提供的例子,例子里面是使用的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代码,点击这里查看。