【问题标题】:C# - WPF - Determining mouse position in canvas only works on top of shapesC# - WPF - 确定画布中的鼠标位置仅适用于形状
【发布时间】:2012-06-22 22:15:15
【问题描述】:

我目前正在开发一种包含某些选择工具的图像处理工具。 为了向用户显示当前选择(例如一个圆圈),使用了三个事件(都在某个画布内):

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,不知何故不会引发。一旦我例如创建一个填充画布的矩形,一切正常。但这带来了另一个问题:如果矩形比画布大,它基本上会超出画布,并且事件也在画布之外工作(只要它位于矩形顶部)。 我真的不明白这里出了什么问题。

【问题讨论】:

    标签: c# wpf wpf-controls mouseevent


    【解决方案1】:

    只有当点击测试表明鼠标指针下方有“东西”时,WPF 才会识别鼠标按钮操作。因此,您应该在画布上实现HitTestCore(PointHitTestParameters)

    这里解释了如何覆盖默认命中测试:http://msdn.microsoft.com/en-us/library/ms752097.aspx#overriding_default_hit_testing

    【讨论】:

    • 谢谢,我可能会用背景画笔。我真的没有想到这一点。现在工作得很好!我仍然会查找 HitTestCore,感谢您的链接!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    相关资源
    最近更新 更多