Добавление и удаление UF-элементов WPF во время выполнения - PullRequest
4 голосов
/ 18 декабря 2010

Есть ли способ логически сгруппировать или пометить элементы UIE, такие как формы и элементы управления, добавленные во время выполнения для легкого удаления?

Например, у меня есть Grid с некоторыми (во время разработки) дочерними элементами идобавьте эллипсы и TextBlock s к нему во время выполнения.Когда я хочу нарисовать другой набор эллипсов и TextBlock s, я бы хотел удалить исходный набор, который я добавил.Что может быть простым способом логически сгруппировать их при добавлении, чтобы я мог просто использовать children.clear () или какой-то способ идентифицировать их, чтобы удалить их?

Можно добавить значение тега, но тамневозможно получить или прочитать это при переборе дочерних элементов элемента управления, поскольку они имеют тип UIElement, у которого нет свойства тега.

Мысли?

Ответы [ 2 ]

10 голосов
/ 18 декабря 2010

Очень хорошее место для использования 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);
    }
}
3 голосов
/ 18 декабря 2010

Попробуйте нарисовать Canvas внутри вашей сетки ... так просто, как:

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

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...