WPF拖放编程

来源:互联网 发布:网络西西河 编辑:程序博客网 时间:2024/06/05 09:18

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

本文只是一个简单的拖放实例。实现的是一个把一个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;

        }

//待续。。