有没有办法对运行时添加的形状和控件等UIE元素进行逻辑分组或标记,以便于删除?
例如,我有一个Grid
带有一些(设计时)子元素,并在运行时向它添加省略号和TextBlock
。当我想绘制一组不同的椭圆和TextBlock
时,我想删除我添加的原始集。什么是一个简单的方法来逻辑分组这些添加它们,所以我可以有一个children.clear()或某种方式来识别它们以删除它们?
可以添加标记值,但是在迭代控件的子项时无法检索或读取它,因为它们的类型为UIElement
,没有标记属性。
思想?
答案 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....});
希望它有所帮助。