Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WPF - is there a way to remove specific child from Canvas.Children?

I am working on a charting control where I am plotting the "analysis range," which is just two vertical lines on the chart. A problem arises when I want to change the analysis range, because I don't know how to remove only the two analysis range lines, so I end up clearing the chart and plotting the actual data values and whatnot again. Is there a way to tag these UI elements (i.e. analysis range is a gridline UI element) so that I can remove them specifically? I suppose I could save the "index" of the UI element somewhere and delete these, but I am wondering if there is a cleaner way of doing this. Thanks a lot.

like image 980
thomas1234 Avatar asked Nov 25 '10 19:11

thomas1234


2 Answers

All UIElements have a UID which is a string. You could set the UID of the range lines to something predictable. Keep in Mind that UID must be unique. Then when you need to remove only the gridlines, you iterate through the Children collection gathering a list of the UI elements that need to be removed, then remove them.

Something like this:

Canvas c = new Canvas();
c.Children.Add( new UIElement() { Uid = "Line1" } );
c.Children.Add( new UIElement() { Uid = "Line2" } );
c.Children.Add( new UIElement() { Uid = "Line3" } );
c.Children.Add( new UIElement() { Uid = "Text1" } ); //This is added as a sample

List<UIElement> itemstoremove = new List<UIElement>();
foreach (UIElement ui in c.Children)
{
  if (ui.Uid.StartsWith("Line"))
  {
    itemstoremove.Add(ui);
  }
}
foreach (UIElement ui in itemstoremove)
{
  c.Children.Remove(ui);
}

That should work. A quick test of this code in debug shows the Children count at 1, with only the UIElement with Uid of Text1 present in the list.

like image 109
thorkia Avatar answered Nov 03 '22 18:11

thorkia


When you add the two lines to the Canvas, can't you hold a reference to the two lines. That way, when you need to redraw them, just do a Canvas.Children.Remove(line1) and Canvas.Children.Remove(line2). Then update your references for the lines and re-add them to the Canvas. You could even just update the X and Y values of the lines themselves rather than removing and re-adding them. This way, the Chart would just move the lines.

But, basically the key is to maintain a reference to the lines after adding them to the Canvas.

like image 24
timothymcgrath Avatar answered Nov 03 '22 19:11

timothymcgrath