利用Interactivity的Behavior实现控件拖动

拖动控件的实现方式至少有两种,一种是将被拖动的控件放在一个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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值