2017-08-13 10 views
0

wpfを試していますが、左クリックでシェイプを作成したいが、マウスポインタが現在マウスオーバーしているシェイプを右クリックしてもらいたい最後に作成されたシェイプは削除されます。これをどうやって解決するのですか?特定の形状をWPFから削除する

これは形状を作成します。これは、形状取り除くことになっていただきまし

private List<Shape> shapes = new List<Shape>(); 
    private Shape shape; 
    public static Random rand = new Random(); 

    private Rectangle CreateRectangle() 
    { 

     int height = rand.Next(0, 151); 
     int width = rand.Next(0, 101); 
     byte alpha = (byte)rand.Next(0, 256); 
     byte alpha2 = (byte)rand.Next(0, 256); 
     byte alpha3 = (byte)rand.Next(0, 256); 
     Rectangle rect = new Rectangle(); 
     rect.Width = width; 
     rect.Height = height; 
     SolidColorBrush color = new SolidColorBrush(); 
     color.Color = Color.FromRgb(alpha, alpha2, alpha3); 
     rect.Fill = color; 
     return rect; 
    } 

    private Ellipse CreateEllipse() 
    { 

     int height = rand.Next(0, 151); 
     int width = rand.Next(0, 101); 
     byte alpha = (byte)rand.Next(0, 256); 
     byte alpha2 = (byte)rand.Next(0, 256); 
     byte alpha3 = (byte)rand.Next(0, 256); 
     Ellipse ellipse = new Ellipse(); 
     ellipse.Width = width; 
     ellipse.Height = height; 
     SolidColorBrush color = new SolidColorBrush(); 
     color.Color = Color.FromRgb(alpha, alpha2, alpha3); 
     ellipse.Fill = color; 
     return ellipse; 

    } 

    private void ColumnDefinition_OnClick(object sender, MouseButtonEventArgs e) 
    { 
     Point area = System.Windows.Input.Mouse.GetPosition(mc); 
     int num = rand.Next(1, 3); 
     switch (num) 
     { 
      case 1: 
       shape = CreateRectangle(); 

       mc.Children.Add(shape); 
       shapes.Add(shape); 
       Canvas.SetLeft(shape, area.X); 
       Canvas.SetTop(shape, area.Y); 
       break; 
      case 2: 
       shape = CreateEllipse(); 
       mc.Children.Add(shape); 
       shapes.Add(shape); 
       Canvas.SetLeft(shape, area.X); 
       Canvas.SetTop(shape, area.Y); 
       break; 
     } 
    } 

    private void Clear_Click(object sender, RoutedEventArgs e) 
    { 
     mc.Children.Clear(); 
    } 

private void mc_MouseRightButtonDown(object sender, MouseButtonEventArgs e) 
    { 

     mc.Children.Remove(shape); 
     shapes.Remove(shape); 
    } 
} 

}

を任意の助けを大幅に高く評価されています。

答えて

0

コード例で必要なものがすべてあるかどうかはわかりませんが、シェイプが作成されてリストに追加されているように見えますが、 "shape"という名前のメンバにも割り当てられています最新の形が作成されました。あなたは常に最新の形を取り除いています。各シェイプにmousedownハンドラを添付し、オブジェクト送信者からシェイプを取得し、リストから削除する必要があります。

private void shape_MouseRightButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    Shape s = sender as Shape; 
    mc.Children.Remove(s); 
    shapes.Remove(s); 
} 
0

私はWPFでヒットテストを学ぶことをお勧めします。 this質問を見て、マウスの下でジオメトリを取得して削除する方法に答えました。あなたはあなたの仕事にこのコードを適応させる必要がありますが、それは非常に簡単です。

XAML:背後

<Canvas Mouse.MouseDown="Canvas_MouseDown"> 

コード:

private void Canvas_MouseDown(object sender, MouseButtonEventArgs e) 
{ 
    var canvas = sender as Canvas; 
    if (canvas == null) 
     return; 

    HitTestResult hitTestResult = VisualTreeHelper.HitTest(canvas, e.GetPosition(canvas)); 
    var shape = hitTestResult.VisualHit as Shape; 
    if (shape == null) 
     return; 

    canvas.Children.Remove(shape); 
    shapes.Remove(shape); // I think you don't need list of shapes 
} 
0

MouseButtonEventArgs.OriginalSourceプロパティをクリックShapeので、あなたはこのようなあなたのmc_MouseRightButtonDownイベントハンドラを実装することができ返します

private void mc_MouseRightButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    Shape clickedShape = e.OriginalSource as Shape; 
    if (clickedShape != null) 
    { 
     mc.Children.Remove(clickedShape); 
     shapes.Remove(clickedShape); 
    } 
} 
関連する問題