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;
}
//待续。。
- WPF拖放编程
- WPF拖放
- WPF拖放功能实现
- WPF拖放功能实现
- WPF拖放功能实现
- WPF拖放功能实现
- WPF拖放功能实现
- WPF中的拖放(一)
- WPF中的拖放(二)
- WPF中的拖放(三)
- WPF之DragDrop拖放实例
- WPF之鼠标拖放复制
- 文件拖放编程实现
- Delphi 拖放文件编程
- 9.Delphi拖放编程
- 拖放
- 拖放
- 拖放
- 得分
- Windows Mobile的蓝牙状态
- android JNI编程 一些技巧(整理)
- wait和waitpid
- Android 网站资源收集大全
- WPF拖放编程
- 什么是syslogd
- 十句表达“很简单”【转】
- 众多站长将网站移民海外 该如何选择国外VPS
- 寄存器与函数栈帧之整理篇
- 正则表达式30分钟入门教程
- VC++思想
- 6与win7的兼容问题
- MSSQL 与 EXCEL互操作