0

キャンバス上にいくつかの楕円を作成する必要があるWPFプロジェクトがあります。2つのチェックボックスを作成し、最初のチェックボックスをオンにすると、赤い楕円がキャンバスに表示されます。最初のチェックボックスをオフにすると、楕円が消えます。2番目のチェックボックスは、代わりに青い楕円を作成することで同じ機能を果たします。

これが私の状況です。2つのチェックボックスをオンにすると、青と赤の楕円が表示されます。キャンバス上の楕円をクリアするには、を使用しmyCanvas.children.clear()ます。しかし、チェックボックスの1つをオフにすると、両方の楕円が削除されます。

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

3 に答える 3

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);
}
于 2012-11-16T10:12:08.127 に答える
1

uncheckedイベントは後で呼び出すと思います。つまり、イベントによって作成されたサークルcheckedはイベントによってクリアされuncheckedます。

checked1つの解決策は、サークルの作成とクリアのロジックを単一のメソッドに移動し、イベントのみを登録することです。

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();
}
于 2012-11-16T09:34:48.477 に答える
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)

任意の数の楕円を使用する場合は、「ブール値の通知」の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/...の近くにチェックボックスを追加できます。

このソリューションでは、楕円を追加/削除したり、チェック済み/チェックなしを処理したりする必要はありません。

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
于 2012-11-16T16:53:25.933 に答える