1

私は現在、特定の選択ツールを含む一種の画像処理ツールに取り組んでいます。現在の選択範囲 (円など) をユーザーに表示するために、3 つのイベントが使用されます (すべて特定のキャンバス内)。

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;
}

これは、円の背後に何らかの形があるという 1 つの条件の下ですべて正常に機能します。どういうわけか、イベント MouseLeftButtonDown/Up および MouseMove は、canvas1 の空の領域で使用された場合に発生しません。たとえば、キャンバスを塗りつぶす長方形を作成すると、すべてが正常に機能します。しかし、それには別の問題が伴います。長方形がキャンバスよりも大きい場合、基本的にキャンバスの外に出て、イベントはキャンバスの外でも機能します (長方形の上にある限り)。ここで何が問題なのか本当にわかりません。

4

1 に答える 1

1

マウス ボタンのアクションは、ヒット テストでマウス ポインターの下に「何か」があることが示された場合にのみ、WPF によって認識されます。したがって、HitTestCore(PointHitTestParameters)キャンバスに実装する必要があります。

デフォルトのヒット テストをオーバーライドする方法については、http: //msdn.microsoft.com/en-us/library/ms752097.aspx#overriding_default_hit_testingを参照してください。

于 2012-06-22T06:07:21.907 に答える