从stackpanel中删除元素

时间:2012-02-21 09:59:53

标签: c# wpf stackpanel

我有一个按钮,按下它时会将文本框和列表框添加到堆栈面板,并将此堆栈面板添加到另一个名为“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);
}

如何删除stackpanel“stackPanelAdd”中的最后一个子节点? 我应该使用像stackPanelAdd.children.Remove这样的东西吗?如果是,那么我如何获得stackpanel中的最后一个元素?

4 个答案:

答案 0 :(得分:7)

尝试:

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

答案 1 :(得分:2)

这不是一个好主意,如果你坚持使用这种方法,事情迟早会变得非常混乱。在处理可在WPF中添加和删除的项目时,您需要在面板顶部使用某种ItemsControl(您可以使用ItemsPanel属性更改面板,默认情况下它将是一个StackPanel)。

使用data templatesdata binding作为您应该熟悉的核心机制,也可以改进控件的创建。

一个例子:

<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中的项目应包含绑定属性NameItems,然后您可以为其分配值或从中输入文本(该类应实现INPC,详细了解article on data binding)中的那些内容。

答案 2 :(得分:1)

您可以使用

var lastControl = stackPanelAdd.Children.LastOrDefault(); 
//Last is defined in System.Linq.Enumrable
if(lastControl != null)
    stackPanelAdd.Children.Remove(lastControl);

答案 3 :(得分:0)

@Milan Halada的答案对我来说有点变化,

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

所以,它删除了所有的孩子,然后我使用for循环动态添加新子项,并使用新数据。