Удалить элементы из стека - PullRequest
2 голосов
/ 21 февраля 2012

У меня есть кнопка, при нажатии она добавляет текстовое поле и список к панели стека и добавляет эту панель стека к другой панели стека с именем "stackPanelAdd".Точно так же:

private void buttonAdd_Click(object sender, RoutedEventArgs e)
{
    StackPanel sp = new StackPanel();
    TextBox tb = new TextBox();   
    ListBox lb = new ListBox();

    tb.Margin = new Thickness(5, 5, 5, 0);
    lb.Margin = new Thickness(5, 5, 5, 0);
    lb.Height = 200;

    sp.Children.Add(tb);
    sp.Children.Add(lb);

    stackPanelAdd.Children.Add(sp);
}

Как удалить последние дочерние элементы в панели стека "stackPanelAdd"?Должен ли я использовать что-то вроде stackPanelAdd.children.Remove?если так, то как мне получить последний элемент в стеке?

Ответы [ 4 ]

7 голосов
/ 21 февраля 2012

Попробуйте:

if (stackPanelAdd.Children.Count>0)
{
  stackPanelAdd.Children.RemoveAt(stackPanelAdd.Children.Count-1);
}
2 голосов
/ 21 февраля 2012

Это не очень хорошая идея, если вы будете придерживаться этого метода, то рано или поздно, вероятно, все станет очень грязно. При работе с элементами, которые могут быть добавлены и удалены в WPF, вы можете использовать ItemsControl некоторого вида поверх панелей (вы можете изменить панель, используя ItemsPanel свойство, по умолчанию это будет StackPanel).

Создание элементов управления также можно улучшить, используя шаблоны данных и привязку данных , которые являются основными механизмами, с которыми вам следует ознакомиться.

Пример:

<ItemsControl ItemsSource="{Binding Data}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBox Text="{Binding Name}" Margin="5,5,5,0"/>
                <ListBox ItemsSource="{Binding Items}" Margin="5,5,5,0" Height="200"/>
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Здесь Data - это исходная коллекция, которая должна реализовывать INotifyCollectionChanged, тогда вы можете просто удалить элемент из этой коллекции, и соответствующая ему StackPanel исчезнет. Элементы в Data должны содержать связанные свойства Name и Items, которым вы затем можете присваивать значения или получать введенный текст (класс должен реализовывать INPC, подробнее об этом в статье о привязке данных ).

1 голос
/ 21 февраля 2012

Вы можете использовать

var lastControl = stackPanelAdd.Children.LastOrDefault(); 
//Last is defined in System.Linq.Enumrable
if(lastControl != null)
    stackPanelAdd.Children.Remove(lastControl);
0 голосов
/ 27 августа 2017

@ Ответ Милана Халады сработал для меня с небольшим изменением,

while (stackPanelAdd.Children.Count>0)
{
  stackPanelAdd.Children.RemoveAt(stackPanelAdd.Children.Count-1);
}

, поэтому он удаляет все дочерние элементы, а затем я динамически добавляю в него новых дочерних элементов, используя цикл for с новыми данными.

...