在运行时添加和删除WPF UIElements

在运行时添加和删除WPF UIElements,wpf,uielement,Wpf,Uielement,是否有一种方法可以对运行时添加的形状和控件等元素进行逻辑分组或标记,以便于删除 例如,我有一个带有一些(设计时)子元素的Grid,并在运行时向其中添加省略号和TextBlocks。当我想画一组不同的椭圆和TextBlocks时,我想删除我添加的原始椭圆集。在添加它们时,有什么简单的方法可以对它们进行逻辑分组,这样我就可以有一个children.clear()或某种方法来识别它们以删除它们 可以添加标记值,但在遍历控件的子级时无法检索或读取标记值,因为它们的类型为UIElement,没有标记属性

是否有一种方法可以对运行时添加的形状和控件等元素进行逻辑分组或标记,以便于删除

例如,我有一个带有一些(设计时)子元素的
Grid
,并在运行时向其中添加省略号和
TextBlock
s。当我想画一组不同的椭圆和
TextBlock
s时,我想删除我添加的原始椭圆集。在添加它们时,有什么简单的方法可以对它们进行逻辑分组,这样我就可以有一个children.clear()或某种方法来识别它们以删除它们

可以添加标记值,但在遍历控件的子级时无法检索或读取标记值,因为它们的类型为
UIElement
,没有标记属性


想法?

尝试在网格内的
画布上绘制。。。这样做很容易:

MyCanvas.Chlidren.Clear();
MyCanvas.Children.Add(new Ellipse { Canvas.Top = 3....});

希望有帮助。

使用
附加属性的好地方

例子: 用法:

public void AddChild(UIElement element, Int32 groupID)
{
    UIElementExtensions.SetGroupID(element, groupID);
    rootPanel.Children.Add(element);
}

public void RemoveChildrenWithGroupID(Int32 groupID)
{
    var childrenToRemove = rootPanel.Children.OfType<UIElement>().
                           Where(c => UIElementExtensions.GetGroupID(c) == groupID);

    foreach (var child in childrenToRemove)
    {
        rootPanel.Children.Remove(child);
    }
}
public void AddChild(UIElement元素,Int32 groupID)
{
SetGroupID(元素,groupID);
rootPanel.Children.Add(元素);
}
public void RemoveChildrenWithGroupID(Int32 groupID)
{
var childrenToRemove=rootPanel.Children.OfType()。
其中(c=>UIElementExtensions.GetGroupID(c)==groupID);
foreach(childrenToRemove中的var child)
{
rootPanel.Children.Remove(child);
}
}

但其中有一些我不想清除的设计时子项,然后将不想清除的子项放入数组[使用x:Name],然后在画布子项中循环,清除数组中不存在的任何项。这非常有用,对我来说非常有用。谢谢。由于父元素是一个用户控件,因此类型与面板不同,因此我还无法获得删除零件的查询,但这应该是直接的。
public void AddChild(UIElement element, Int32 groupID)
{
    UIElementExtensions.SetGroupID(element, groupID);
    rootPanel.Children.Add(element);
}

public void RemoveChildrenWithGroupID(Int32 groupID)
{
    var childrenToRemove = rootPanel.Children.OfType<UIElement>().
                           Where(c => UIElementExtensions.GetGroupID(c) == groupID);

    foreach (var child in childrenToRemove)
    {
        rootPanel.Children.Remove(child);
    }
}