1

私の現在のプログラムでは、ユーザーがポイントをクリックしてから別のポイント (少なくとも 20 ピクセル離れた場所) をクリックし、2 つのポイントの間に線を引くことができます。これを複数回実行できるように、ポリラインを使用しました。すべての行のセットは、すべてのクリックが行われた後にのみ表示されますが.

void DrawingCanvas_MouseUp(object sender, MouseButtonEventArgs e) {
        Point position = e.GetPosition(this);

        if (leftList == null) {
            //starting a new set
            leftList.Add(position);
            lastPoint = position;
            return;
        }
        //calculate distance, i.e. end click
        double a = lastPoint.X - position.X;
        double b = lastPoint.Y - position.Y;
        double distance = Math.Sqrt(a * a + b * b);
        if (distance > 20) {
            //continue to add to list
            leftList.Add(position);
            lastPoint = position;
        } else {
            //end of the line
            paint();
            leftList = new PointCollection(); 
        }

    }

    private void paint() {
        Polyline line = new Polyline();
        line.Visibility = System.Windows.Visibility.Visible;
        line.StrokeThickness = 2;
        line.Stroke = System.Windows.Media.Brushes.Black;
        line.Points = leftList;
        myCanvas.Children.Add(line);
    }

だから私の質問は2つあります:

A)クリックするたびに新しい行がすぐに追加されるようにするにはどうすればよいですか。

B) 最後のポイントとマウス カーソルが現在ある場所 (つまり、次のポイントを選択する直前) の間の線をレンダリングするにはどうすればよいですか?

4

2 に答える 2

2

次の簡単な例では、マウスの左ボタンが押され、ボタンが押されたままマウスが最小点距離 20 だけ移動すると、新しいポリラインの描画が開始されます。最後のポリライン セグメント (現在のマウス位置まで) を、その長さに応じて赤または緑で描画します。マウス ボタンが離され、新しいセグメントの長さが >= 20 の場合、ポリラインに新しいポイントが追加されます。それ以外の場合、ポリラインは終了し、新しいポリラインを作成できます。

private Polyline polyline;
private Polyline segment = new Polyline { StrokeThickness = 2 };

private void Canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    if (polyline == null)
    {
        var canvas = (Canvas)sender;
        var point = e.GetPosition(canvas);

        // create new polyline
        polyline = new Polyline { Stroke = Brushes.Black, StrokeThickness = 2 };
        polyline.Points.Add(point);
        canvas.Children.Add(polyline);

        // initialize current polyline segment
        segment.Stroke = Brushes.Red;
        segment.Points.Add(point);
        segment.Points.Add(point);
        canvas.Children.Add(segment);
    }
}

private void Canvas_MouseMove(object sender, MouseEventArgs e)
{
    if (polyline != null)
    {
        // update current polyline segment
        var canvas = (Canvas)sender;
        segment.Points[1] = e.GetPosition(canvas);

        var distance = (segment.Points[0] - segment.Points[1]).Length;
        segment.Stroke = distance >= 20 ? Brushes.Green : Brushes.Red;
    }
}

private void Canvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    if (polyline != null)
    {
        var canvas = (Canvas)sender;
        segment.Points[1] = e.GetPosition(canvas);

        var distance = (segment.Points[0] - segment.Points[1]).Length;

        if (distance >= 20)
        {
            polyline.Points.Add(segment.Points[1]);
            segment.Points[0] = segment.Points[1];
        }
        else
        {
            if (polyline.Points.Count < 2)
            {
                canvas.Children.Remove(polyline);
            }

            polyline = null;
            segment.Points.Clear();
            canvas.Children.Remove(segment);
        }
    }
}
于 2013-04-10T09:00:10.307 に答える
0

クリックごとにポイントのコレクションを維持してください。コレクションでは、StartPoint と EndPoint のような 2 つのプロパティを持つ 1 つのクラスを追加できます。

マウスが初めてクリックされたとき、開始点のみを持つコレクションに1つのクラスオブジェクトを追加するだけです。次にマウスをクリックすると、クラスの最後のオブジェクトに終点が移動し、その間に新しいオブジェクトを作成し、この点を始点として割り当ててコレクションに追加し、その後ペイント関数を呼び出します。

于 2013-04-10T05:55:14.160 に答える