拖动控件的实现方式至少有两种,一种是将被拖动的控件放在一个Canvas之后,利用改变该控件的附加属性Canvas.LeftProperty和Canvas.Top两个属性,就可以实现被拖动的控件在Canvas中的位置。而这次我们不需要将控件放到一个Canvas控件里面,可以是任务需要实现拖动的控件,并且不关心他的父级控件的类型,利用UIElement类的RenderTransform属性,改变其TranslateTransform的X和Y值,就可以实现控件的鼠标拖动效果了。
下面给出这个类的实现
public class DragBehavior : Behavior<FrameworkElement>
{
protected bool isDragging = false;
private Point startPosition;
private DropShadowEffect effect = new DropShadowEffect();
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.MouseDown += AssociatedObject_MouseDown;
AssociatedObject.MouseMove += AssociatedObject_MouseMove;
AssociatedObject.MouseUp += AssociatedObject_MouseUp;
AssociatedObject.MouseEnter += AssociatedObject_MouseEnter;
AssociatedObject.MouseLeave += AssociatedObject_MouseLeave;
effect.ShadowDepth = 0;
effect.BlurRadius = 5;
effect.Color = Colors.Black;
AssociatedObject.Effect = effect;
}
//鼠标离开去掉阴影
private void AssociatedObject_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
{
effect.BlurRadius = 5;
}
//鼠标进入增加阴影
private void AssociatedObject_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
{
effect.BlurRadius = 15;
}
protected override void OnDetaching()
{
base.OnDetaching();
AssociatedObject.MouseDown -= AssociatedObject_MouseDown;
AssociatedObject.MouseMove -= AssociatedObject_MouseMove;
AssociatedObject.MouseUp -= AssociatedObject_MouseUp;
}
private void AssociatedObject_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
isDragging = true;
var parent = AssociatedObject.Parent as FrameworkElement;
var clickPosition = e.GetPosition(parent);
//首次按下时,判断RenderTransform的类型是否为TranslateTransform
if (!(AssociatedObject.RenderTransform is TranslateTransform))
{
AssociatedObject.RenderTransform = new TranslateTransform();
}
var transform = AssociatedObject.RenderTransform as TranslateTransform;
startPosition.X = clickPosition.X - transform.X;
startPosition.Y = clickPosition.Y - transform.Y;
AssociatedObject.CaptureMouse();//强制鼠标捕捉
}
private void AssociatedObject_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
{
if (isDragging)
{
var parent = AssociatedObject.Parent as FrameworkElement;
Point currentPosition = e.GetPosition(parent);
var transform = AssociatedObject.RenderTransform as TranslateTransform;
transform.X = currentPosition.X - startPosition.X;
transform.Y = currentPosition.Y - startPosition.Y;
}
}
private void AssociatedObject_MouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
isDragging = false;
AssociatedObject.ReleaseMouseCapture();//释放鼠标捕捉
}
}
怎么用?
//利用Interaction.Behaviors将DragBehavior附加到Border控件上,Border就可以被拖动了
<Border Cursor="Hand" Width="80" Height="80" Background="SkyBlue" CornerRadius="40">
<i:Interaction.Behaviors>
<behavior:DragBehavior/>
</i:Interaction.Behaviors>
<TextBlock Text="拖动" Foreground="White" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>