WPF - 有没有办法从Canvas.Children中删除特定的孩子?

时间:2010-11-25 19:06:02

标签: wpf canvas wpf-controls

我正在绘制图表控件,我正在绘制“分析范围”,这只是图表上的两条垂直线。当我想要更改分析范围时会出现问题,因为我不知道如何仅删除两个分析范围行,因此我最终清除了图表并绘制了实际数据值以及其他内容。有没有办法标记这些UI元素(即分析范围是一个网格线UI元素),以便我可以专门删除它们?我想我可以在某处保存UI元素的“索引”并删除它们,但我想知道是否有更简洁的方法来执行此操作。非常感谢。

2 个答案:

答案 0 :(得分:3)

所有UIElement都有一个字符串UID。您可以将范围行的UID设置为可预测的值。请记住,UID必须是唯一的。然后,当您只需要删除网格线时,您将遍历Children集合,收集需要删除的UI元素列表,然后将其删除。

这样的事情:

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

那应该有用。在调试中对此代码的快速测试显示,Children计数为1,列表中仅显示带有文本1的Uid的UIElement

答案 1 :(得分:2)

当您将两行添加到Canvas时,您不能保留对这两行的引用。这样,当您需要重绘它们时,只需执行Canvas.Children.Remove(line1)Canvas.Children.Remove(line2)。然后更新行的参考,并将它们重新添加到Canvas。您甚至可以只更新行本身的X和Y值,而不是删除和重新添加它们。这样,图表就会移动线条。

但是,基本上关键是在将这些行添加到Canvas之后保持对行的引用。