吴佳鑫的个人专栏

当日事当日毕,没有任何借口

导航

SL鼠标拖动

实现鼠标down、up 和move 事件可以在布局面板中使用鼠标拖动或移动嵌套在Border控件中的图像或对象。

XAML代码:

 

代码
<Canvas x:Name="LayoutRoot" Background="White">
<Border x:Name="border1" Canvas.Top="100" Canvas.Left="10"
MouseLeftButtonDown
="border1_MouseLeftButtonDown"
MouseLeftButtonUp
="border1_MouseLeftButtonUp"
MouseMove
="border1_MouseMove">
<Image x:Name="MyImage" Source="images/DingosLogo.png"Stretch="Uniform" >
</Image>
</Border>
</Canvas>

 

 

上面代码行定义了需要处理的3 个事件。

正如其名称所示,需要处理左鼠标按下事件、左鼠标单击并放开事件和左鼠标移动事件。

在后置代码中,当左鼠标按下,将设置一个全局变量用来标识用户开始移动。

在鼠标移动时,将设置一个鼠标当前位置并为Border 控件设置新位置。

当左鼠标释放时,将重设全局变量以便不会移动更多的对象。

 

public partial class Page : UserControl
 {
// 全局变量用于定义用户是否点击边框和开始/停止移动
private bool moving = false;
private double offSetX;
private double offSetY;
public Page() 
{
InitializeComponent();
}
private void border1_MouseLeftButtonDown(object sender,MouseButtonEventArgs e) 
{
// 鼠标左键编辑开始移动
moving = true;Point offset = e.GetPosition(border1);
offSetX = offset.X;offSetY = offset.Y;
}

private void border1_MouseLeftButtonUp(object sender,MouseButtonEventArgs e)
 {
// 鼠标左键释放,停止移动
moving = false;
}

private void border1_MouseMove(object sender, MouseEventArgs e)
 {
if(moving)
 {
// 得到鼠标新的位置
Canvas parent = (Canvas)this.border1.Parent;
Point p = e.GetPosition(parent);
double x = p.X - offSetX;double y = p.Y - offSetY;// 设置边框控件的新位置this.border1.SetValue(Canvas.LeftProperty, x);this.border1.SetValue(Canvas.TopProperty, y);
}
}
}

 

posted on 2010-08-20 17:29  _eagle  阅读(495)  评论(0编辑  收藏  举报