WPF拖放编程

在学习阶段。写这篇完全是为了方便记忆。。。

本文只是一个简单的拖放实例。实现的是一个把一个Image拖放到Canvas上,然后在Canvas上可以自由移动位置的简单实现。

首先,新建一个Wpf应用程序。在Xaml里面添加如下代码:

 <Grid>
        <Grid.Resources>
            <TransformGroup x:Key="PicResources">
                <TranslateTransform/>
            </TransformGroup>
        </Grid.Resources>
        <Grid.RowDefinitions>
            <RowDefinition Height="58*"></RowDefinition>
                <RowDefinition Height="204*"></RowDefinition>
        </Grid.RowDefinitions>
        <Image Name="image1" AllowDrop="True" Source="image/1.bmp" MouseLeftButtonDown="image1_MouseLeftButtonDown" Grid.Row="0"></Image>
        <Canvas Name="canvas" AllowDrop="True" Grid.Row="1" Background="Beige"   Drop="canvas_Drop"></Canvas>
    </Grid>

 1.在后台的时间中添加如下代码:

        private void image1_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            Image pic = (Image)sender;
            //DoDragDrop需要指定拖放源对象,拖放的内容和拖放的效果
           DragDrop.DoDragDrop(pic, new ImageBrush(pic.Source), DragDropEffects.Copy);
        }

这段代码中的DoDragDrop有三个参数:第一个参数是指拖放源;第二个参数为拖放过程中目标能得到的数据;第三个为枚举类型,指处理数据的方式。

2.在后台加一个canvas_Drop方法:

        private void canvas_Drop(object sender, DragEventArgs e)
        {
            canvas.Children.Clear();
            ImageBrush imags = e.Data.GetData(typeof(ImageBrush)) as ImageBrush;
            Image imag = new Image();
            imag.Source = imags.ImageSource;
            Canvas.SetTop(imag, 100);
            Canvas.SetLeft(imag, 100);
            canvas.Children.Add(imag);
            Canvas.SetZIndex(imag, 2);

        }

当拖动源到目标时,新建一个Image对象。Image对象的源图片为源Image的源图片。这样就实现了图片的拖放。

3.现在图片已经放到了canvas上了。

下面就是在canvas上的拖动图片的操作了:

在canvas上面添加事件,

 canvas.PreviewMouseLeftButtonDown += new System.Windows.Input.MouseButtonEventHandler(canvas_PreviewMouseLeftButtonDown);
canvas.PreviewMouseMove += new System.Windows.Input.MouseEventHandler(canvas_PreviewMouseMove);
canvas.PreviewMouseLeftButtonUp += new System.Windows.Input.MouseButtonEventHandler(canvas_PreviewMouseLeftButtonUp);
canvas.PreviewKeyDown += new System.Windows.Input.KeyEventHandler(window1_PreviewKeyDown);

MouseLeftButtonDown事件中添加代码:

 if (e.Source == canvas)
            {

//如果引发事件的源是canvas,则不作任何事。
            }
            else
            {
                _isDown = true;                  //如果引发事件的源是canvas上的其他对象。则获得该点的坐标和鼠标状态
                _startPoint = e.GetPosition(canvas);
                _originalElement = e.Source as UIElement;
                canvas.CaptureMouse();
                e.Handled = true;
            }

 在PreviewMouseMove 的事件代码中添加如下代码:

  if (_isDown)
            {
                if ((_isDragging == false) && ((Math.Abs(e.GetPosition(canvas).X - _startPoint.X) > SystemParameters.MinimumHorizontalDragDistance) ||
                    (Math.Abs(e.GetPosition(canvas).Y - _startPoint.Y) > SystemParameters.MinimumVerticalDragDistance)))
                {
                    DragStarted();
                }
                if (_isDragging)
                {
                    DragMoved();
                }
            }

其中DragStarted和DragMoved的函数如下:

 private void DragStarted()
        {
            _isDragging = true;
            _originalLeft = Canvas.GetLeft(_originalElement);
            _originalTop = Canvas.GetTop(_originalElement);

            _overlayElement = new SimpleCircleAdorner(_originalElement);
            AdornerLayer layer = AdornerLayer.GetAdornerLayer(_originalElement);
            layer.Add(_overlayElement);
        }

   private void DragMoved()
        {
            Point CurrentPosition = System.Windows.Input.Mouse.GetPosition(canvas);

            _overlayElement.LeftOffset = CurrentPosition.X - _startPoint.X;
            _overlayElement.TopOffset = CurrentPosition.Y - _startPoint.Y;

        }

//待续。。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MCode

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值