添加后如何删除单个canvas中的单个子画面?

我有一个WPF项目,我必须在canvas上创建一些椭圆。 我创建了两个复选框,当我检查第一个复选框时,红色椭圆将显示在canvas上。 如果我取消选中第一个复选框,椭圆将消失….第二个复选框将通过创建蓝色椭圆而具有相同的function。

因此,在我的情况下,当选中两个复选框时,将出现蓝色和红色椭圆。 要清除canvas上的椭圆,我使用myCanvas.children.clear() 。 但是当我取消选中其中一个复选框时,两个椭圆都将被删除。

 private void redCB_Checked(object sender, RoutedEventArgs e) { drawRedCircle(); } private void redCB_Unchecked(object sender, RoutedEventArgs e) { myCanvas.Children.Clear(); } private void blueCB_Checked(object sender, RoutedEventArgs e) { drawBlueCircle(); } private void blueCB_Unchecked(object sender, RoutedEventArgs e) { myCanvas.Children.Clear(); } private void drawRedCircle() { Ellipse myCircle = new Ellipse(); myCircle.Stroke = Brushes.Red; myCircle.Width = 30; myCircle.Height = 30; myCircle.StrokeThickness = 2; Canvas.SetLeft(myCircle, 10); Canvas.SetRight(myCircle, 10); Canvas.SetBottom(myCircle, 10); Canvas.SetTop(myCircle, 10); myCanvas.Children.Add(myCircle); } private void drawBlueCircle() { Ellipse myCircle = new Ellipse(); myCircle.Stroke = Brushes.Blue; myCircle.Width = 30; myCircle.Height = 30; myCircle.StrokeThickness = 2; Canvas.SetLeft(myCircle, 20); Canvas.SetRight(myCircle, 20); Canvas.SetBottom(myCircle, 20); Canvas.SetTop(myCircle, 20); myCanvas.Children.Add(myCircle); } 

如果您为添加的圈子添加名称,则可以在取消选中该复选框时找到该名称,然后轻松将其删除。

 private string redCircleName = "redCircle"; private string blueCircleName = "blueCircle"; private void redCB_Checked(object sender, RoutedEventArgs e) { drawRedCircle(); } private void redCB_Unchecked(object sender, RoutedEventArgs e) { RemoveCircleByName(redCircleName); } private void blueCB_Checked(object sender, RoutedEventArgs e) { drawBlueCircle(); } private void blueCB_Unchecked(object sender, RoutedEventArgs e) { RemoveCircleByName(blueCircleName); } private void RemoveCircleByName(string name) { var circle = (UIElement)LogicalTreeHelper.FindLogicalNode(myCanvas, name); myCanvas.Children.Remove(circle); } private void drawRedCircle() { Ellipse myCircle = new Ellipse(); myCircle.Stroke = Brushes.Red; myCircle.Width = 30; myCircle.Height = 30; myCircle.StrokeThickness = 2; //Give it a name here so we can find it later myCircle.Name = redCircleName; Canvas.SetLeft(myCircle, 10); Canvas.SetRight(myCircle, 10); Canvas.SetBottom(myCircle, 10); Canvas.SetTop(myCircle, 10); myCanvas.Children.Add(myCircle); } private void drawBlueCircle() { Ellipse myCircle = new Ellipse(); myCircle.Stroke = Brushes.Blue; myCircle.Width = 30; myCircle.Height = 30; myCircle.StrokeThickness = 2; //Give it a name here so we can find it later myCircle.Name = blueCircleName; Canvas.SetLeft(myCircle, 20); Canvas.SetRight(myCircle, 20); Canvas.SetBottom(myCircle, 20); Canvas.SetTop(myCircle, 20); myCanvas.Children.Add(myCircle); } 

我认为稍后会unchecked事件,这意味着unchecked checked事件会清除由checked事件创建的圈子。

一种解决方案可以是将创建和清除圆圈的逻辑移动到单个方法,并且仅注册已checked事件。

 private void drawCircle() { myCanvas.Children.Clear(); if(redCB.Checked) drawRedCircle(); if(blueCB.Checked) drawBlueCircle(); } private void redCB_Checked(object sender, RoutedEventArgs e) { drawCircle(); } private void blueCB_Checked(object sender, RoutedEventArgs e) { drawCircle(); } 

而不是添加/删除为什么不使用椭圆的可见性(IsVisible)? 将它们绑定到通知布尔属性,并将checkBox绑定到该属性。

 // ellipse1Visible is a notifying boolean Binding ellipseBinding = new Binding("ellipse1Visible"); ellipseBinding .Source = ??? ; // set your binding source here (? this ?) myEllipse.SetBinding(Ellipse.IsVisibleProperty, ellipseBinding ); myRelatedCheckBox.SetBinding(CheckBox.IsCheckedProperty, ellipseBinding) 

如果你想使用任意数量的椭圆,你必须使用’通知布尔值’的Array / List / ObservableColection语法是:

  // i is a valid index in the ellipseVisible collection of notifying boolean. Binding ellipseBinding = new Binding("ellipseVisible[" & i & "]"); // the rest of the code is the same 

您可以在附近的StackPanel / listBox / …中添加复选框,同时在canvas中添加相关的椭圆。

无需添加/删除椭圆,也无需使用此解决方案处理已选中/未选中状态。

Rq:如果你打算不使用每个椭圆的可见性,你甚至可以用更简单的方式来做:没有布尔值,而是直接将可见性绑定到CheckBox的IsChecked属性:

 // ... we just created myEllipse and myCheckBox // ... and inserted them into canvas/stackPanel Binding ellipseBinding = new Binding("IsChecked"); ellipseBinding.Source = myCheckBox; myEllipse.SetBinding(Ellipse.IsVisibleProperty, ellipseBinding); // and that's all