2012-11-16 43 views
0

我有一個WPF項目,我必須在畫布上創建幾個橢圓。我創建了兩個複選框,當我檢查第一個複選框時,紅色橢圓將顯示在畫布上。如果我取消選中第一個複選框,則橢圓將消失....第二個複選框將通過創建藍色橢圓而具有相同的功能。如何在添加單個畫布後刪除單個孩子?

所以繼承我的情況,當兩個複選框被選中時,會出現藍色和紅色的橢圓。要清除畫布上的橢圓,我使用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); 
    } 

回答

3

如果您爲添加的圓圈命名,您可以在複選框未選中時找到它,然後很容易地將其刪除。

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

我想以後unchecked事件調用,這意味着通過checked事件創建的循環由unchecked事件清除。

一個解決方案可以是將創建和清除圓圈的邏輯移動到單個方法,並且只註冊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(); 
} 
+0

在你的解決方案中,我不能在同一時間得到2個橢圓,對吧? – 0070

+0

你可以看到更新@ 0070 –

+0

當我編譯它時,出現錯誤:事件'System.Windows.Controls.Primitives.ToggleButton.Checked'只能出現在+ =或 - =的左側。 – 0070

0

而不是添加/刪除爲什麼不使用橢圓的可見性(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) 

,如果你想使用任意數量的橢圓形的,你必須使用 「通知布爾」 語法的數組/列表/ 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/...的同時在畫布中添加相關的橢圓。

無需添加/刪除橢圓,也無需處理選中/取消選中此解決方案。

的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 
相關問題