WPF - есть ли способ удалить конкретного ребенка из Canvas.Children? - PullRequest
4 голосов
/ 25 ноября 2010

Я работаю над графическим элементом управления, где я строю «диапазон анализа», который представляет собой две вертикальные линии на графике.Проблема возникает, когда я хочу изменить диапазон анализа, потому что я не знаю, как удалить только две линии диапазона анализа, поэтому я заканчиваю тем, что очищаю график и строю графики фактических значений данных и еще много чего еще.Есть ли способ пометить эти элементы пользовательского интерфейса (т. Е. Диапазон анализа является элементом пользовательского интерфейса линии сетки), чтобы я мог удалить их конкретно?Полагаю, я мог бы где-нибудь сохранить «индекс» элемента пользовательского интерфейса и удалить их, но мне интересно, есть ли более чистый способ сделать это.Большое спасибо.

Ответы [ 2 ]

4 голосов
/ 25 ноября 2010

Все UIElement имеют UID, который является строкой. Вы можете установить UID линий диапазона в нечто предсказуемое. Имейте в виду, что UID должен быть уникальным. Затем, когда вам нужно удалить только линии сетки, вы перебираете коллекцию Children, собирая список элементов пользовательского интерфейса, которые необходимо удалить, а затем удаляете их.

Примерно так:

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

Это должно сработать. Быстрый тест этого кода в отладке показывает количество детей в 1, при этом в списке присутствует только UIElement с Uid of Text1.

2 голосов
/ 25 ноября 2010

Когда вы добавляете две строки к Canvas, вы не можете удерживать ссылку на две строки.Таким образом, когда вам нужно перерисовать их, просто сделайте Canvas.Children.Remove(line1) и Canvas.Children.Remove(line2).Затем обновите ваши ссылки на строки и повторно добавьте их в Canvas.Вы даже можете просто обновить значения X и Y самих линий, а не удалять и повторно добавлять их.Таким образом, диаграмма будет просто перемещать линии.

Но, в основном, ключ заключается в сохранении ссылки на линии после добавления их в Canvas.

...