MouseMove事件与MouseLeftButtonUP事件的有关问题
MouseMove事件与MouseLeftButtonUP事件的问题
Canvas的MouseMove事件执行时为什么无法准确捕捉到MouseLeftButtonUP和MouseLeftButtonDown事件,每次鼠标弹起时偶尔能捕捉到UP事件,大多数情况下还处于Move事件中,无法获得最后的点啊,大神么帮点忙吧!
------解决思路----------------------
还没解决?? 上点代码例子,,,好测试看看
------解决思路----------------------
怎么可能呢,建议Up事件中移除Move事件钩子,对于这种又要移动又要触发鼠标按键的情况,我通常是使用MouseEnter来添加MouseMove、MouseDown等事件钩子,在MouseLeave中移除这些钩子,然后MouseDown事件再添加MouseUp事件钩子,MouseUp事件再移除这些钩子,看似费事其实可以避免逻辑冲突。
------解决思路----------------------
用你这个代码改写就是这样的
namespace WpfApplication1
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
Point pcanvas;
Boolean flag;
public MainWindow()
{
InitializeComponent();
}
private void canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
pcanvas = e.GetPosition(canvas);
}
private void canvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
this.canvas.canvas_MouseMove -= this.canvas_MouseMove;
}
private void canvas_MouseMove(object sender, MouseEventArgs e)
{
Point pBig = new Point();
pBig = e.GetPosition(canvas);
Rectangle curve3 = canvas.FindName("newrectangle") as Rectangle;
if (curve3 != null)
{
canvas.Children.Remove(curve3);
canvas.UnregisterName("newrectangle");
}
Rectangle rectangle = new Rectangle();//矩形对象
//属性设置,填充颜色、边粗细、边颜色、宽、高等
rectangle.StrokeThickness = 1;
rectangle.Stroke = System.Windows.Media.Brushes.Green; //边,粉色
rectangle.Width = Math.Abs(pBig.X - pcanvas.X);
rectangle.Height = Math.Abs(pBig.Y - pcanvas.Y);
//矩形对象相对于父容器对象Canvas的位置,左边距、上边距
Canvas.SetLeft(rectangle, pcanvas.X);
Canvas.SetTop(rectangle, pcanvas.Y);
canvas.Children.Add(rectangle);
canvas.RegisterName("newrectangle", rectangle);
}
private void button1_Click(object sender, RoutedEventArgs e)
{
this.canvas.canvas_MouseMove += this.canvas_MouseMove;
}
}
}
------解决思路----------------------
上面粘贴写的有点错了,不是 this.canvas.canvas_MouseMove +=而是 this.canvas.MouseMove += , -=也是,你鼠标左键释放事件中将MouseMove事件通过-=移除不可能还在能触发的啦
Canvas的MouseMove事件执行时为什么无法准确捕捉到MouseLeftButtonUP和MouseLeftButtonDown事件,每次鼠标弹起时偶尔能捕捉到UP事件,大多数情况下还处于Move事件中,无法获得最后的点啊,大神么帮点忙吧!
------解决思路----------------------
还没解决?? 上点代码例子,,,好测试看看
------解决思路----------------------
怎么可能呢,建议Up事件中移除Move事件钩子,对于这种又要移动又要触发鼠标按键的情况,我通常是使用MouseEnter来添加MouseMove、MouseDown等事件钩子,在MouseLeave中移除这些钩子,然后MouseDown事件再添加MouseUp事件钩子,MouseUp事件再移除这些钩子,看似费事其实可以避免逻辑冲突。
------解决思路----------------------
用你这个代码改写就是这样的
namespace WpfApplication1
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
Point pcanvas;
Boolean flag;
public MainWindow()
{
InitializeComponent();
}
private void canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
pcanvas = e.GetPosition(canvas);
}
private void canvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
this.canvas.canvas_MouseMove -= this.canvas_MouseMove;
}
private void canvas_MouseMove(object sender, MouseEventArgs e)
{
Point pBig = new Point();
pBig = e.GetPosition(canvas);
Rectangle curve3 = canvas.FindName("newrectangle") as Rectangle;
if (curve3 != null)
{
canvas.Children.Remove(curve3);
canvas.UnregisterName("newrectangle");
}
Rectangle rectangle = new Rectangle();//矩形对象
//属性设置,填充颜色、边粗细、边颜色、宽、高等
rectangle.StrokeThickness = 1;
rectangle.Stroke = System.Windows.Media.Brushes.Green; //边,粉色
rectangle.Width = Math.Abs(pBig.X - pcanvas.X);
rectangle.Height = Math.Abs(pBig.Y - pcanvas.Y);
//矩形对象相对于父容器对象Canvas的位置,左边距、上边距
Canvas.SetLeft(rectangle, pcanvas.X);
Canvas.SetTop(rectangle, pcanvas.Y);
canvas.Children.Add(rectangle);
canvas.RegisterName("newrectangle", rectangle);
}
private void button1_Click(object sender, RoutedEventArgs e)
{
this.canvas.canvas_MouseMove += this.canvas_MouseMove;
}
}
}
------解决思路----------------------
上面粘贴写的有点错了,不是 this.canvas.canvas_MouseMove +=而是 this.canvas.MouseMove += , -=也是,你鼠标左键释放事件中将MouseMove事件通过-=移除不可能还在能触发的啦