鼠标点的读取
- 首先需要在WPF中的前端页面获取对鼠标的操作
- 在一个布局里(Grid)新建关于鼠标的相关“事件”
//相关事件
MouseEnter="grid_MouseEnter" //鼠标进入
MouseLeave="grid_MouseLeave"//鼠标离开
MouseLeftButtonDown="grid_MouseLeftButtonDown"//鼠标左键按下
MouseLeftButtonUp="grid_MouseLeftButtonUp"//鼠标左键抬起
MouseMove="grid_MouseMove"//鼠标离开
后台相关操作
- 主要是要获取鼠标在进入后的“第一个点”与“第二个点”
//声明Point指针类型的字段
private Point point;
//声明鼠标是否按下的Bool类型的字段并且初始值是“false”(按下isDown=true没按isDown=false)
private bool isDown = false;
//new一个能绘制(line)成线的类型的对象
Line dot = new Line();
//这个是关于鼠标移动的事件
private void grid_MouseMove(object sender, MouseEventArgs e) {
if (isDown) {
//按下并移动就相当于获取第二点
Point point2 = e.GetPosition(grid);
Console.WriteLine("鼠标移动" + point2);
//连线
dot.X1 = point.X;
dot.Y1 = point.Y;
dot.X2 = point2.X;
dot.Y2 = point2.Y;
point =point2;
}
}
具体的流程代码
private void grid_MouseEnter(object sender, MouseEventArgs e) {
Console.WriteLine("进入");
}
private void grid_MouseLeave(object sender, MouseEventArgs e) {
Console.WriteLine("离开");
}
private void grid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) {
point = e.GetPosition(grid);
//鼠标按下就是第一个点
Console.WriteLine("鼠标按下"+point);
isDown = true;
}
private void grid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) {
Console.WriteLine("鼠标松开" + e.GetPosition(grid));
isDown = false;
}
private Point point;
private bool isDown = false;
Line dot = new Line();
private void grid_MouseMove(object sender, MouseEventArgs e) {
if (isDown) {
Point point2 = e.GetPosition(grid);
Console.WriteLine("鼠标移动" + point2);
//连线
dot.X1 = point.X;
dot.Y1 = point.Y;
dot.X2 = point2.X;
dot.Y2 = point2.Y;
point =point2;
}
}
关于输出的结果
具体实例运用
将画笔封装成一个方法且带参数
//new一个对象后面加花括号的作用是为了赋值公有数据可写字段的。
//geometries 这个对象在画图中FillRule为填充规则的意思,它有两个属性值,EvenOdd,Nonzero
//EvenOdd是具有穿透效果,Nonzero没有穿透效果
private GeometryGroup geometries = new GeometryGroup() { FillRule = FillRule.Nonzero };
//传进去的参数分别是"第一个点"和"最后一个点"
private void Domousemove(Point start, Point end) {
//path为滑动的各个点形成的集合
//GetWidenedPathGeometry(Pen pen):是获取通过画笔形成的形状,里面的对象是"Pen"
//将这个"Pen"笔的颜色设置成"Brushes.Red",大小是通过绑定"PenWidth"属性(PenWidth是可以根据实际情况设置的)
//StartLineCap /EndLineCap 分别为画笔起点与笔画末端使用的形状类型
var path = new LineGeometry(start, end).GetWidenedPathGeometry(new Pen(Brushes.Red, PenWidth) { StartLineCap = PenLineCap.Round, EndLineCap = PenLineCap.Round });
geometries.Children.Add(path);
//Geometry 是形成图形的属性;
Geometry = geometries;
}
总结:简单的Demo可以用具体的一个定值来做实验,但在具体的实例中或这个项目可能就要用到许多的对象引入,属性的传入以及相关的绑定等