在学习阶段。写这篇完全是为了方便记忆。。。
本文只是一个简单的拖放实例。实现的是一个把一个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;
}
//待续。。