写了这么些年程序,界面写的较少。实习被逼补了下。趁有空总结下。
模仿着写了一个简单的拖拽相应命令的Demo。当鼠标点击屏幕时,生成一个红色的UI(这里用Rectangle表示),当点击Rectangle时,变成绿色,可以拖拽它。当松开它时,就会变成黄色。
在XAML里,我让它相应一个鼠标左键按下的命令。
<Canvas x:Name="myCanvas" Background="White" MouseLeftButtonDown="myCanvas_MouseLeftButtonDown">
</Canvas>
看具体的代码:
using System.Windows;
usingSystem.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
usingSystem.Windows.Shapes;
namespaceclickAndDragMouseEvents
{
public partialclass MainPage: UserControl
{
//Judge if the mouse is dragging some circles.
private boolisDragging = false;
//Store the offset between the click point andthe center of the ellipse
private PointmouseOffset = new Point();
public MainPage()
{
InitializeComponent();
}
//当有鼠标左键点击的Event发出时,处理这个Event,生成一个UIControl。这里选择一个矩形当做UI。
private voidmyCanvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if(isDragging == false)
{
CanvasmyCanvs = (Canvas)sender;
Rectanglerect = new Rectangle();
rect.Fill = new SolidColorBrush(Colors.Red);
rect.Height = 50;
rect.Width = 50;
PointclickPoint = e.GetPosition(this);
rect.SetValue(Canvas.LeftProperty, clickPoint.X - rect.Width /2);
rect.SetValue(Canvas.TopProperty, clickPoint.Y - rect.Height /2);
rect.MouseLeftButtonDown +=Ellipse_MouseLeftButtonDown;
myCanvas.Children.Add(rect);
}
}
//当该UI Rectangle被选中(点击)时,做相应的处理。比如通过强制转换sender来获取被点击的UI;修改它的颜色(或者别的你需要的操作);使用+=操作符来订阅鼠标移动,鼠标左键点击等事件;
private void Ellipse_MouseLeftButtonDown(object sender, MouseButtonEventArgse)
{
if(isDragging == false)
{
isDragging = true;
Rectangleellipse = (Rectangle)sender;//看是哪个UI被选中了。
ellipse.Fill = new SolidColorBrush(Colors.Green);
ellipse.MouseMove += Ellipse_MouseMoving;//订阅鼠标移动消息
ellipse.MouseLeftButtonUp +=Ellipse_MouseLeftButtonUp;
mouseOffset =e.GetPosition(ellipse);
ellipse.CaptureMouse();//如果没有CaptureMouse(),那么当鼠标移动过快离开了该UI范围后,该UI就相应不到鼠标的事件了。
}
}
//随着鼠标的移动来移动UI的位置。
private voidEllipse_MouseMoving(object sender, MouseEventArgs e)
{
if(isDragging == true)
{
Rectangleellipse = (Rectangle)sender;
ellipse.SetValue(Canvas.LeftProperty, e.GetPosition(this).X - mouseOffset.X);
ellipse.SetValue(Canvas.TopProperty, e.GetPosition(this).Y - mouseOffset.Y);
}
}
//当鼠标左键松开了,做相应的处里,比如让UI不再相应鼠标事件了。
private voidEllipse_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
if(isDragging == true)
{
isDragging = false;
Rectangleellipse = (Rectangle)sender;
ellipse.SetValue(Canvas.LeftProperty, e.GetPosition(this).X - mouseOffset.X);
ellipse.SetValue(Canvas.TopProperty, e.GetPosition(this).Y - mouseOffset.Y);
ellipse.Fill = new SolidColorBrush(Colors.Orange);
ellipse.ReleaseMouseCapture();
}
}
}
}