2016-08-11 2 views
0

私のコードで助けが必要です。 combineShape.Freeze()関数がうまく動作していないように見えます。コード内のGeometryGroupを使用して結合シェイプを作成する

このシナリオでは、2つのラジオボタンrbtPointとrbtLineがあります。 rbtPointをクリックしてキャンバスをクリックするとポイントが作成され、キャンバス内に2ポイント(ellipse1、ellipse2)を作成する必要があります。このステップでは、すでにキャンバスの周りにポイント(ellipse1またはelipse2)をドラッグすることができます。次に、rbtLineをクリックして最初の点(ellipse1)をクリックすると、点の色が赤から青に変わります.2番目の点(ellipse2)をもう一度クリックすると、色も赤に変わります。 ellipse1からellipse2に青い線を結んで作成します。 その後、GeometryGroup()関数を使用して、線と2点が1つの図形に結合されます。私は、このリンクからコードを見た:私は1つをもう一度クリックすると、

 
private void myCanvas_MouseDown(object sender, MouseButtonEventArgs e) 
     { 
      mouseDown = true; 
      initialPoint = e.GetPosition(sender as IInputElement); 

      if (rbtPoint.IsChecked == true) 
      { 
       if (e.OriginalSource is Ellipse) 
       { 
        captured = true; 
        shapePoint = e.GetPosition(sender as IInputElement); 
        clickedEllipse = (Ellipse)e.OriginalSource; 
        uielement = (UIElement)e.OriginalSource; 
       } 
       else 
       { 
        shapeEllipse = new Ellipse(); 
        (shapeEllipse as Ellipse).Width = 30; 
        (shapeEllipse as Ellipse).Height = 30; 
        (shapeEllipse as Ellipse).StrokeThickness = 5; 
        (shapeEllipse as Ellipse).Fill = Brushes.Red; 
        Canvas.SetLeft(shapeEllipse, initialPoint.X); 
        Canvas.SetTop(shapeEllipse, initialPoint.Y); 
        myCanvas.Children.Add(shapeEllipse); 
       } 
      } 
     }    
 
private void myCanvas_MouseUp(object sender, MouseButtonEventArgs e) 
     { 
      Mouse.Capture(null); 
      captured = false; 
      mouseDown = false; 
      if (rbtLine.IsChecked == true) 
      { 
       if (e.OriginalSource is Ellipse) 
       { 
        captured = true; 
        initialPoint = e.GetPosition(sender as IInputElement); 
        clickedEllipse = (Ellipse)e.OriginalSource; 
        uielement = (UIElement)e.OriginalSource; 
        poin = e.MouseDevice.GetPosition(uielement); 
        clickedEllipse.Fill = Brushes.Blue; 
        if (firstpoint.X != 0 && firstpoint.Y != 0) 
        { 
         lineEndPoint = initialPoint; 
        } 
        else 
        { 
         firstpoint = initialPoint; 
        } 
       } 

       if (lineEndPoint.X != 0 && lineEndPoint.Y != 0) 
       { 
        Point p = e.GetPosition(sender as IInputElement); 
        shapeLine = new Line(); 
        (shapeLine as Line).X1 = firstpoint.X; 
        (shapeLine as Line).Y1 = firstpoint.Y; 
        (shapeLine as Line).X2 = lineEndPoint.X; 
        (shapeLine as Line).Y2 = lineEndPoint.Y; 
        (shapeLine as Line).Stroke = Brushes.Blue; 
        (shapeLine as Line).StrokeThickness = 5; 
        //(shape as Line).Fill = Brushes.Blue; 
        //Canvas.SetLeft(shape, firstpoint.X); 
        //Canvas.SetTop(shape, firstpoint.Y); 
        myCanvas.Children.Add(shapeLine); 
        lineCreated = true; 

        var ellipse1 = new EllipseGeometry(firstpoint, firstpoint.X, firstpoint.Y); 
        var ellipse2 = new EllipseGeometry(lineEndPoint, lineEndPoint.X, lineEndPoint.Y); 
        var line = new LineGeometry(this.firstpoint, this.lineEndPoint); 

        GeometryGroup combinedShape = new GeometryGroup(); 
        combinedShape.Children.Add(ellipse1); 
        combinedShape.Children.Add(ellipse2); 
        combinedShape.Children.Add(line); 

        combinedShape.Freeze(); 
       } 

      } 
     } 

私はcombinedShape.Freeze()関数を実行した後:ここで

http://stackoverflow.com/questions/16417950/combining-linegeometry-with-ellipsegeometry-in-code-not-xaml

は、関数を作成するために私のコードですポイントをドラッグしてドラッグすると、マウスの移動に追従して、他のポイントとラインがなくてもクリックされたポイントだけが移動します。

この問題を解決するにはどうすればよいですか?多くの記事が関連していますが、そのほとんどはXAMLのコードをコードではありません。あるいはこれを解決する他の方法はありますか? は私が

は、あなたの助けのためのコードマスターをありがとう、この問題のための提案を必要とするあなたが本当にそれを凍結する必要はありませんように...

Fikri

+0

この記事をチェックしましたか? https://msdn.microsoft.com/en-us/library/ms750593%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396 –

答えて

0

は私にね。 Freeze()は、ジオメトリを変更できないようにします。

唯一の他の選択肢は、フリーズされたジオメトリをclone()してからフリーズしたものを削除することです。

private void myCanvas_MouseDown(object sender, MouseButtonEventArgs e) 
     { 
      mouseDown = true; 
      initialPoint = e.GetPosition(sender as IInputElement); 

      if (rbtPoint.IsChecked == true) 
      { 
       if (e.OriginalSource is Ellipse) 
       { 
        captured = true; 
        shapePoint = e.GetPosition(sender as IInputElement); 
        var frozen = (Ellipse)e.OriginalSource; 
        clickedEllipse = frozen.Clone(); 
        myCanvas.Children.Remove(frozen); 
        myCanvas.Children.Add(clickedEllipse); 
        uielement = (UIElement)clickedEllipse; 
       } 
       else 
関連する問題