我目前正在开发一种包含某些选择工具的图像处理工具。 为了向用户显示当前选择(例如圆圈),使用了三个事件(全部在某个画布内):
public MainWindow()
{
InitializeComponent();
}
private Ellipse _ellip = new Ellipse();
private Point _p = new Point();
private bool _mouse = false;
private double _xcor, _ycor;
private void mouseDown(object sender, MouseButtonEventArgs e)
{
_p = Mouse.GetPosition(canvas1);
_xcor = _p.X;
_ycor = _p.Y;
_mouse = true;
}
private void newPos(object sender, MouseEventArgs e)
{
if (mouse)
{
_ellip.Visibility = Visibility.Visible;
_p = Mouse.GetPosition(canvas1);
_ellip.Margin = new Thickness((_xcor + _p.X) / 2 - Math.Sqrt((_xcor - _p.X) * (_xcor - _p.X) + (_ycor - _p.Y) * (_ycor - _p.Y)) / 2, (_ycor + _p.Y) / 2 - Math.Sqrt((_xcor - _p.X) * (_xcor - _p.X) + (_ycor - _p.Y) * (_ycor - _p.Y)) / 2, 0, 0);
ellip.Height = Math.Sqrt((_xcor - _p.X) * (_xcor - _p.X) + (_ycor - _p.Y) * (_ycor - _p.Y));
ellip.Width = Math.Sqrt((_xcor - _p.X) * (_xcor - _p.X) + (_ycor - _p.Y) * (_ycor - _p.Y));
}
InvalidateVisual();
}
private void mouseUp(object sender, MouseButtonEventArgs e)
{
mouse = false;
ellip.Visibility = Visibility.Hidden;
}
在一种情况下,这一切都很好:圆圈后面有某种形状。不知何故,如果在canvas1的空白区域使用事件,则不会引发MouseLeftButtonDown / Up和MouseMove事件。一旦我,例如创建一个填充画布的矩形,一切正常。但这带来了另一个问题:如果矩形比画布大,它基本上会离开画布,事件也可以在画布之外工作(只要它在矩形的顶部)。 我真的不明白这里出了什么问题。
答案 0 :(得分:1)
仅当命中测试表明鼠标指针下有“某事”时,WPF才会识别鼠标按钮操作。因此,您应该在画布上实现HitTestCore(PointHitTestParameters)
。
以下是如何覆盖默认命中测试的说明:http://msdn.microsoft.com/en-us/library/ms752097.aspx#overriding_default_hit_testing。