在运行时添加和删除WPF UIElements

时间:2010-12-18 18:54:25

标签: wpf uielement

有没有办法对运行时添加的形状和控件等UIE元素进行逻辑分组或标记,以便于删除?

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

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

思想?

2 个答案:

答案 0 :(得分:10)

使用Attached Property的好地方。

实施例

// Create an attached property named `GroupID`
public static class UIElementExtensions
{
    public static Int32 GetGroupID(DependencyObject obj)
    {
        return (Int32)obj.GetValue(GroupIDProperty);
    }

    public static void SetGroupID(DependencyObject obj, Int32 value)
    {
        obj.SetValue(GroupIDProperty, value);
    }

    // Using a DependencyProperty as the backing store for GroupID.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty GroupIDProperty =
        DependencyProperty.RegisterAttached("GroupID", typeof(Int32), typeof(UIElementExtensions), new UIPropertyMetadata(null));
}

用法:

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

答案 1 :(得分:3)

尝试在网格中的Canvas上绘图......就像这样简单:

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

希望它有所帮助。