示例中的两个图形分别包含在两个子画布中,这两个子画布共享相同的事件处理器,分别是MouseLeftButtonDown、MouseMove和MouseLeftButtonUp事件,XAML代码如下所示。
<Canvas x:Name="parentCanvas"
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Loaded="Page_Loaded"
x:Class="DragandDropDemo.Page;assembly=ClientBin/DragandDropDemo.dll"
Width="640"
Height="480"
Background="White"
>
<Canvas
MouseLeftButtonDown="onMouseDown"
MouseLeftButtonUp="onmouseup"
MouseMove="onMouseMove"
Canvas.Top="20" Canvas.Left="50">
<Ellipse
Height="100" Width="100"
Fill="Gold"
stroke="Black" strokeThickness="4" />
<Ellipse
Height="50" Width="50"
Canvas.Top="25" Canvas.Left="25"
Fill="Black" />
</Canvas>
<!-- 定义一个钻石形状 -->
<Canvas
MouseLeftButtonDown="onMouseDown"
MouseLeftButtonUp="onmouseup"
MouseMove="onMouseMove"
Canvas.Top="140" Canvas.Left="100">
<!--使用旋转渐变让该画布旋转45度-->
<Canvas.RenderTransform>
<RotateTransform Angle="45" />
</Canvas.RenderTransform>
<Rectangle
Height="100" Width="100"
Fill="Coral"
stroke="Black" strokeThickness="4" />
</Canvas>
</Canvas>
上面的代码很简单的画了两个图形,分别位于两个画布中,拖动的实际代码如下所示。
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace DragandDropDemo
{
public partial class Page : Canvas
{
//beginX和beginY用于保存鼠标上一次的位置
private double beginX;
private double beginY;
//isMouseDown获取和设置鼠标是否按下的布尔变量
private bool isMouseDown = false;
public void Page_Loaded(object o,EventArgs e)
{
// required to initialize variables
InitializeComponent();
}
//鼠标左键按下时的事件代码
public void onMouseDown(object sender,MouseEventArgs e)
{
//将当前的鼠标位置传给私有变量
beginX = e.GetPosition(null).X;
beginY = e.GetPosition(null).Y;
//将isMouseDown设为true表示鼠标按下。
isMouseDown = true;
//由于CaptureMouse都定义在UIElement中,所以这里、转换为UIElement类
((UIElement)sender).CaptureMouse();
}
//鼠标移动
public void onMouseMove(object sender,MouseEventArgs e)
{
//如果鼠标处理按下状态
if (isMouseDown == true)
{
//获取鼠标当前位置
double currX = e.GetPosition(null).X;
double currY = e.GetPosition(null).Y;
//获取当前图形的位置
double currLeft = (double)((UIElement)sender).GetValue(Canvas.LeftProperty);
double currTop = (double)((UIElement)sender).GetValue(Canvas.TopProperty);
//移动当前图形的位置
((UIElement)sender).SetValue(Canvas.LeftProperty,currLeft + currX - beginX);
((UIElement)sender).SetValue(Canvas.TopProperty,currTop + currY - beginY);
//将当前位置保存起来,继续拖动。
beginX = currX;
beginY = currY;
}
}
//释放鼠标左键
public void onmouseup(object sender,MouseEventArgs e)
{
isMouseDown = false;
//停止鼠标捕捉
((UIElement)sender).ReleaseMouseCapture();
}
}
}
来源于http://blog.csdn.net/silverlightria/article/details/2323740
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。